【发布时间】:2018-03-02 22:29:28
【问题描述】:
所以我定义了一个模型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)
我可以使用try/except 在django shell 中创建Language 实例,如下所示。
try:
language, exists = Language.objects.get_or_create(creator=choice(USERS),
language='german')
except IntegrityError:
pass
但是当我尝试通过 django admin 创建语言实例时,django admin 会抛出 IntegrityError。
我的问题:如何在我的模型中实现类似 try/except 块的内容,以检查用户尝试创建语言时是否已经存在语言?
我进行了很多搜索,发现了来自signals 的 pre_save,我怀疑这可能会有所帮助。但是 django 文档几乎没有示例。
任何帮助将不胜感激。
【问题讨论】:
-
创建一个模型管理器并定义一个管理器方法来检查是否存在匹配的语言。在这种情况下,您总是需要使用 manager 方法进行保存
-
不相关,但您不应该将查询集创建为模块级变量 - 您最终会得到陈旧的数据
-
Django 的管理员应该已经在检查已经存在的值,因为您在该字段上有
unique=True。你有没有做任何事情来覆盖表单?显示您的管理员课程。 -
@OluwafemiSule 我正在调查。听起来像我需要的。