Django在创建模型时使用外键自动创建模型

时间:2015-03-17 20:15:26

标签: django django-models

我正在我的网页上发表评论部分,希望用户能够对评论进行投票或投票。

我的模型是这样的:

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和编程的新手,但从我的理解,我需要创建一个保存钩子或类似的东西?

2 个答案:

答案 0 :(得分:5)

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

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

我建议您阅读documentation以获得更好的见解。

答案 1 :(得分:1)

考虑以下代码:

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即可。我不建议覆盖保存方法。