0

私は Django Channels を使用しており、追加のフィールドをjson投稿のデータとともにデータベースに保存できるようにしたいと考えています。

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

私のモデルは、ここにあるPostmieDjango Channels チュートリアルのモデルと同じです。唯一の違いは、私のモデルには、私のユーザー モデルのメール フィールドを指す追加の外部キーがあることです。Post

email=request.user.email動作しません。電子メールを非表示のフィールドに入れることを考えていましたが、それは安全ではないようです。

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

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)

ポストミー モデル:

@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
4

1 に答える 1

0

Usermie がユーザーモデルであると仮定します。これは、settings.py に AUTH_USER_MODEL='yourapp.Usermie' があることを意味します。

to_fieldを使用していない場合は、次のことができます。

私はあなたが次のことをする必要があると思います

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を使用している場合:Django > 1.10 のみ

ドキュメントによると、電子メールは一意である必要があります。

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

于 2017-01-02T01:30:36.017 に答える