2017-01-01 18 views
0

私はDjangoチャンネルを使用していますので、投稿のjsonのデータとともにデータベースに追加のフィールドを保存したいと考えています。Djangoデータベースに追加データを保存します

私のPostmieモデルには、私のユーザモデルのemailフィールドを指す外部キーがあります。 Postmieは、データベースへの投稿を保存するモデルです。外部キーは、email_idというフィールドを作成します。私はデータベースに投稿を保存している間に、投稿を行っているユーザーの電子メールを取得し、データベースにも保存したいと考えています。これをやり遂げるにはどうすればいいですか?私はDjangoフォームを使用していません。

Postmieモデルが唯一の違いは、私のモデルは私のユーザモデルに電子メールフィールドを指して、余分な外部キーを持っているということである、hereを発見したDjangoのチャンネルのチュートリアルPostにおけるものと同じです。

email=request.user.emailは機能しません。私は電子メールを隠しフィールドに入れようと考えていましたが、それは私には安全ではないようです。

私が使用している方法はDjango Channelsのチュートリアルでは実質的に同じ方法ですhereconsumers.pyです。すべてが機能しますが、投稿のためにデータベースの他のフィールドに入力することはできません。

def save_post(message, slug, request): 
    """ 
    Saves vew post to the database. 
    """ 
    post = json.loads(message['text'])['post'] 
    email = request.user.email 
    feed = Feed.objects.get(slug=slug) 
    Postmie.objects.create(feed=feed, body=post email_id=email) 

Postmieモデル:

@python_2_unicode_compatible 
class Postmie(models.Model): 
    # Link back to the main blog. 
    feed = models.ForeignKey(Feed, related_name="postmie") 
    email = models.ForeignKey(Usermie, 
           to_field="email", 
           related_name="postmie_email", max_length=50) 
    subject = models.CharField(max_length=50) 
    classs = models.CharField(max_length=50, null=True, blank=True) 
    subclass = models.CharField(max_length=50, null=True, blank=True) 
    title = models.CharField(max_length=60, null=True, blank=True) 
    body = models.TextField() 
    date_created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return "#%i: %s" % (self.id, self.body_intro()) 

    def post_email(self): 
     return self.email 

    def post_subject(self): 
     return self.subject 

    def post_datetime(self): 
     return self.datetime 

    def get_absolute_url(self): 
     """ 
     Returns the URL to view the liveblog. 
     """ 
     return "/feed/%s/" % self.slug 

    def body_intro(self): 
     """ 
     Short first part of the body to show in the admin or other compressed 
     views to give you some idea of what this is. 
     """ 
     return self.body[:50] 

    def html_body(self): 
     """ 
     Returns the rendered HTML body to show to browsers. 
     You could change this method to instead render using RST/Markdown, 
     or make it pass through HTML directly (but marked safe). 
     """ 
     return linebreaks_filter(self.body) 

    def send_notification(self): 
     """ 
     Sends a notification to everyone in our Liveblog's group with our 
     content. 
     """ 
     # Make the payload of the notification. We'll JSONify this, so it has 
     # to be simple types, which is why we handle the datetime here. 
     notification = { 
      "id": self.id, 
      "html": self.html_body(), 
      "date_created": self.date_created.strftime("%a %d %b %Y %H:%M"), 
     } 
     # Encode and send that message to the whole channels Group for our 
     # feed. Note how you can send to a channel or Group from any part 
     # of Django, not just inside a consumer. 
     Group(self.feed.group_name).send({ 
      # WebSocket text frame, with JSON content 
      "text": json.dumps(notification), 
     }) 

    def save(self, *args, **kwargs): 
     """ 
     Hooking send_notification into the save of the object as I'm not 
     the biggest fan of signals. 
     """ 
     result = super(Postmie, self).save(*args, **kwargs) 
     self.send_notification() 
     return result 
+0

「外部キーはemail_idというフィールドを作成します」とはどういう意味ですか?あなたは私たちにPostmieのモデルを見せてもらえますか?あなたはforiegnキーとしてユーザーを使用できますか? –

+0

私は 'Postmie'モデルを追加しました。私が作成した外部キ​​ーは 'email'と呼ばれます。しかし、データベースに作成された列は 'email_id'と呼ばれます。 'feed'フィールドと同じように、データベースの列名は' field_id'と呼ばれます。これはDjangoのやり方だと思う。 – Jam1

+0

ここで、問題は 'email_id'が外部キー' email'オブジェクトの 'id'です。'post_save'シグナルを作成して電子メールオブジェクトを作成し、このオブジェクトを関連付けることができます。 – karthikr

答えて

0

Usermieは、ユーザーモデルであると仮定すると。あなたはto_fieldは、あなたが行うことができます使用していない場合、これはあなたがsettings.py

にAUTH_USER_MODEL =「yourapp.Usermie」を持っていることを意味し、

は、私はあなたが次の操作を行う必要があると思う

Postmie.objects.create(feed=feed, body=post email=request.user) 

それとも、

Postmie.objects.create(feed=feed, body=post email_id=request.user.id) 

を行うことができますあなたはそのすべての外部キーを知っている必要があります_idで追加されたフィールド名でデータベース上に表示されます。これは、Djangoが外部キーを置く方法です。通常、DjangoのORMを直接使用してください。

あなたはto_fieldを使用している場合のみ、ジャンゴに> 1.10

documentationによると、メールは一意でなければなりません。

Postmieの作成後にto_fieldが変更された場合。列のすべての値に新しい対応する値が設定されていることを確認してください。

+0

これは動作しません。私はそれが 'request.user.id'が文字列を返さないか、またはこの"文脈 "の中でデータベースに格納可能か、あるいは表現できる値を与えないものだと思います。適切な "コンテキスト"は私の 'navsbarのように' request.user.username'を持ち、htmlページの文字列としてユーザ名を与えますが、Djangoの機能の中では他のものと解釈されます。それは私が少なくともそれから得るものです。助けてくれてありがとう! – Jam1

+0

それを考えると、 'request.user.id'または' request.user.something'はすべての文脈で文字列でなければなりません。 – Jam1

+0

あなたのsettings.pyにAUTH_USER_MODEL = 'yourapp.Usermie'がありません。これはあなたのモデルをAUTH_USERとして使用し、それをrequest.userに添付する必要があります。すべての場合、idまたはpkは常に整数です。 Usermieモデルでは、Userに1対1のフィールドをモデル化します。 request.user.usermieを逆の関係として使用することができます。 –

関連する問題