【问题标题】:Auto-create model with foreign key when model is created - Django创建模型时使用外键自动创建模型 - Django
【发布时间】:2015-05-20 10:59:39
【问题描述】:

我正在我的网页上创建一个 cmets 部分,并希望用户能够对评论投赞成票或反对票。

我的模型是这样的:

class Comment(models.Model):
    owner = models.ForeignKey(User)
    body = models.TextField(null=True, blank=True, max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Vote(models.Model):
    comment = models.ForeignKey(Comment)
    upvote = models.SmallIntegerField(null=True, blank=True, default=0)
    downvote = models.SmallIntegerField(null=True, blank=True, default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

当用户发表评论时,我希望它还创建一个链接到该评论的投票模型。

我是 django 和编程新手,但据我了解,我需要创建一个保存挂钩或类似的东西吗?

【问题讨论】:

标签: django django-models


【解决方案1】:

你可以覆盖Comment模型的save()方法,即:

class Comment(models.Model):
    ...
    def save(self, **kwargs):
        super(Comment, self).save(**kwargs)
        vote = Vote(comment=self)
        vote.save()

我建议您阅读documentation 以获得更好的洞察力。

【讨论】:

  • 这正是我所需要的。非常感谢
【解决方案2】:

考虑这段代码:

class ModelA(models.Model):
    name = models.CharField(max_length=30)

    @classmethod
    def get_new(cls):
        return cls.objects.create().id



class ModelB(models.Model):
    thing = models.OneToOneField(ModelA, primary_key=True, default=ModelA.get_new)
    num_widgets = IntegerField(default=0)

当然你也可以使用 lambda,只要你返回相关对象的整数 id。我不建议覆盖保存方法。

【讨论】:

  • "我不推荐覆盖保存方法。" ——你能解释一下为什么吗?接受的答案正是建议这样做,也许有充分的理由不这样做?
  • 需要注意的一点:这会在相关模型上调用 create,而在当前模型上调用 save。在这里,如果我们调用ModelB(),会导致创建并保存一个ModelA对象,这可能会导致保存的ModelA对象意外扩散。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 2019-10-17
  • 2017-05-11
  • 2020-09-23
  • 1970-01-01
  • 2023-01-02
  • 2017-12-21
  • 2023-03-23
相关资源
最近更新 更多