web-dev-qa-db-ja.com

Django:追加する前にオブジェクトがすでに存在するかどうかを確認してください

これは非常に単純なDjangoの質問ですが、多くのハンティングにもかかわらず、Djangoドキュメントで答えを見つけることができません!

オブジェクトがすでに存在するかどうかを確認し、存在する場合にのみ追加するにはどうすればよいですかnotすでに存在しますか?

コードは次のとおりです。follow_roleが既に存在する場合は、データベースに2回追加したくありません。最初に確認するにはどうすればよいですか? get()を使用するかもしれません-しかし、get()が何も返さない場合、Django文句を言うでしょうか?

current_user = request.user
follow_role = UserToUserRole(from_user=current_user, to_user=user, role='follow')
follow_role.save()

ありがとう!

26
AP257

モデルマネージャには、「get_or_create」と呼ばれるこのイディオムのヘルパー関数があります。

role, created = UserToUserRole.objects.get_or_create(
    from_user=current_user, to_user=user, role='follow')

(model、bool)のタプルを返します。ここで、「model」は関心のあるオブジェクトであり、「bool」はそれを作成する必要があるかどうかを示します。

38
Joe Holloway

Djangoの最新バージョンを使用している場合は、UserToUserRoleモデルに nique_together オプションを使用してから、Joe Hollowayが示したget_or_create()メソッドを使用できます。これにより、重複を取得できないことが保証されます。

4
Harper Shelby

ブール値を探している場合

UserToUserRole.objects.filter(
    from_user=current_user, to_user=user, role='follow'
).exists()
1
Daniil Mashkin

保存する前に毎回チェックを実行したい場合は、保存前のシグナルを使用してチェックできます。 http://docs.djangoproject.com/en/dev/ref/signals/#Django.db.models.signals .pre_save

または、モデルで、アイテムが同じアイテムであるかどうかを決定するプロパティにunique = Trueを指定できます。これにより、同じものを再度保存しようとすると、例外(Django.db.IntegrityError)がスローされます。

何かをユニークにする複数のフィールドが一緒にある場合は、メタ内部クラスでunique_togetherを使用する必要があります http://docs.djangoproject.com/en/dev/ref/models/options/#unique -一緒に

0
Stephen Paulger

Get()を使用できますが、次の場合を除いて、tryでラップする必要があります。

try:
    obj = UserToUserRole.objects.get(from_user=current_user, to_user=user, role='follow')
except UserToUserRole.DoesNotExist:
    # here write a code to create a new object
0
Akbar