0

我有一个模型如下:

class Vote(models.Model):

    vote_type = models.BooleanField()
    voted_by =  models.ForeignKey(User, related_name='voted_by')
    voted_for = models.OneToOneField(User, related_name='voted_for')
    article = models.ForeignKey(Article, null=True, blank=True)
    dtobject  = models.DateTimeField(auto_now_add=True)

我想确保用户只能为一个对象投票一次。因此,在我看来,我会执行以下操作:

    v = Vote.objects.get_or_create(
        vote_type = vtype.get(field_name),
        voted_by_id = request.user.id,
        voted_for_id = mobj.shared_by_id,
        shared_object_id = oid
        )

它第一次运行良好,但是当已有投票时,我得到一个完整性错误,原因很明显。鉴于上述模型和观点,确保对象未被投票的好方法是什么?

4

2 回答 2

1

get_or_create 中的参数分为两部分:第一部分是必须存在的唯一实例的完全匹配,其他变量数据必须在名为“defaults”的参数中找到

请参阅文档https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

obj, created = Person.objects.get_or_create(first_name='John', 
    last_name='Lennon', defaults={'birthday': date(1940, 10, 9)})

不确定您在这里的唯一密钥是什么,我猜它是 voted_by 和 voted_for,所以我们有:

vote, created = Vote.objects.get_or_create(
    voted_by = request.user,
    vote_type = vtype.get(field_name),
    defaults = dict(
        voted_for_id = mobj.shared_by_id,
        shared_object_id = oid
      )
    )
于 2012-11-25T15:39:38.220 回答
0

get_or_create返回一个元组。

vote, created = Vote.objects.get_or_create(
    vote_type = vtype.get(field_name),
    voted_by = request.user,
    voted_for_id = mobj.shared_by_id,
    shared_object_id = oid
    )

在哪里或者说它是否从数据库中创建或检索createdTrueFalse

于 2012-11-24T07:24:44.870 回答