これは非常に単純な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()
ありがとう!
モデルマネージャには、「get_or_create」と呼ばれるこのイディオムのヘルパー関数があります。
role, created = UserToUserRole.objects.get_or_create(
from_user=current_user, to_user=user, role='follow')
(model、bool)のタプルを返します。ここで、「model」は関心のあるオブジェクトであり、「bool」はそれを作成する必要があるかどうかを示します。
Djangoの最新バージョンを使用している場合は、UserToUserRoleモデルに nique_together オプションを使用してから、Joe Hollowayが示したget_or_create()メソッドを使用できます。これにより、重複を取得できないことが保証されます。
ブール値を探している場合
UserToUserRole.objects.filter(
from_user=current_user, to_user=user, role='follow'
).exists()
保存する前に毎回チェックを実行したい場合は、保存前のシグナルを使用してチェックできます。 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 -一緒に
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