モデルLanguage
を定義しました。言語オブジェクトを作成した人を追跡する必要があります。私は同じ言語の複数のインスタンスを必要としません。そのため、ユーザーが言語を作成しようとしたときに言語が既に存在するかどうかを確認できるようにしたいと考えています。それが存在すれば、私はすでに存在するものを使うことができるとユーザに伝えます。そうでなければ、彼らはそれを作成することができます。私はカスタムUser
モデルを使用しています。モデルのインスタンスが既にデータベースに存在するかどうかを確認する方法
USERS = get_user_model().objects.all()
from random import choice
class Language(models.Model):
language = models.CharField(max_length=25, unique=True)
creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
def __str__(self):
return self.language
def get_absolute_url(self):
return reverse('chinemerem:language_index')
def save(self, *args, **kwargs):
self.language = self.language.upper()
super(Language, self).save(*args, **kwargs)
私は以下のようにdjango
shell
にtry/except
でLanguage
インスタンスを作成することができます。私は、Djangoの管理を介して、言語のインスタンスを作成しようとする
try:
language, exists = Language.objects.get_or_create(creator=choice(USERS),
language='german')
except IntegrityError:
pass
しかしdjango admin
はIntegrityError
スローします。
私の質問:モデル内に上記のtry/except
ブロックを実装して、ユーザーが作成しようとしたときに言語が既に存在するかどうかを確認するにはどうすればよいですか?
私は多くの検索を行い、参考になると思われるsignalsからpre_saveを見つけました。しかし、djangoのドキュメントにはほとんど例がありません。
ご協力いただければ幸いです。
モデルマネージャを作成し、一致する言語が存在するかどうかをチェックするマネージャメソッドを定義します。この場合は常にマネージャメソッドを使用して保存する必要があります –
モジュールレベルの変数としてクエリセットを作成しないでください - 無効なデータで終了します –
[一致するクエリの処理方法オブジェクトを取得するときに存在する](https://stackoverflow.com/questions/33119507/how-to-handle-matching-query-does-not-exist-when-getting-an-object) – Sayse