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)

ユーザーがオブジェクトに投票できるのは1回だけであることを確認したいと思います。したがって、私の見解では、私は次のことを行います。

    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 のパラメーターは 2 つの部分で構成されます。最初の部分は、存在する必要がある唯一のインスタンスの正確な一致であり、他の変数データは「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
    )

どこにcreatedあるのTrueか、またはFalseデータベースから作成または取得されたのかと言います。

于 2012-11-24T07:24:44.870 に答える