私は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
「外部キーはemail_idというフィールドを作成します」とはどういう意味ですか?あなたは私たちにPostmieのモデルを見せてもらえますか?あなたはforiegnキーとしてユーザーを使用できますか? –
私は 'Postmie'モデルを追加しました。私が作成した外部キーは 'email'と呼ばれます。しかし、データベースに作成された列は 'email_id'と呼ばれます。 'feed'フィールドと同じように、データベースの列名は' field_id'と呼ばれます。これはDjangoのやり方だと思う。 – Jam1
ここで、問題は 'email_id'が外部キー' email'オブジェクトの 'id'です。'post_save'シグナルを作成して電子メールオブジェクトを作成し、このオブジェクトを関連付けることができます。 – karthikr