Django 计算模型实例数
假设我有一个名为Django 计算模型实例数,django,django-models,unique,Django,Django Models,Unique,假设我有一个名为User的模型,其中有一个名为name的字段。如何确定数据库中是否已存在具有特定名称的用户实例 我可以做到: matched_users = User.objects.filter(name = 'Andrew') if matched_users.count() == 0: # It does not exist else: # It does exist 但是,有没有一种方法可以在一行中完成这项工作,而不必检索所有实例,然后对它们进行计数?:让它尝试创建一个
User
的模型,其中有一个名为name
的字段。如何确定数据库中是否已存在具有特定名称的用户实例
我可以做到:
matched_users = User.objects.filter(name = 'Andrew')
if matched_users.count() == 0:
# It does not exist
else:
# It does exist
但是,有没有一种方法可以在一行中完成这项工作,而不必检索所有实例,然后对它们进行计数?:让它尝试创建一个副本并处理异常
您需要在名称
字段中定义以下内容:
Field.unique
这是在数据库级别和通过模型验证实施的。如果你
尝试在唯一字段中保存具有重复值的模型,即
django.db.IntegrityError将由模型的save()方法引发
:让它尝试创建副本并处理异常
您需要在名称
字段中定义以下内容:
Field.unique
这是在数据库级别和通过模型验证实施的。如果你
尝试在唯一字段中保存具有重复值的模型,a
django.db.IntegrityError将由模型的save()方法引发
是的,您可以使用:
但可能有多个同名用户。您可能需要查找某些唯一字段,例如用户名或电子邮件
如果您想坚持使用count
方法,则可以将其编写为:
if User.objects.filter(name = 'Andrew').count() > 0:
# exists
是的,您可以使用:
但可能有多个同名用户。您可能需要查找某些唯一字段,例如用户名或电子邮件
如果您想坚持使用count
方法,则可以将其编写为:
if User.objects.filter(name = 'Andrew').count() > 0:
# exists
这已经是你想要的了。因为Django惰性地评估QuerySet,所以它不会检索所有实例。在调用count()
之前,不会命中数据库。也就是说,exists()
是更直接的方法。这已经满足了您的需求。因为Django惰性地评估QuerySet,所以它不会检索所有实例。在调用count()
之前,不会命中数据库。也就是说,exists()
是更直接的方式。在与数据库交互时,请求原谅并不是那么简单。例如,IntegrityError
将破坏当前事务,无论您是否捕获它。@KevinChristopherHenry我本可以发布exists()
解决方案,但我只想从另一个角度提供备选解决方案。并且,取决于用例——例如,如果OP在创建用户之前检查是否存在同名用户,则两种解决方案都有权存在。如果是这种情况,则减少到数据库的往返次数。感谢您的反馈。我的观点只是警告读者不要盲目应用EAFP习惯用法——Python开发人员非常熟悉这种习惯用法——而不仔细考虑与数据库的交互。我同意你的观点,对于某些用例,这将是更有效的解决方案。在与数据库交互时,请求原谅并不是那么简单。例如,IntegrityError
将破坏当前事务,无论您是否捕获它。@KevinChristopherHenry我本可以发布exists()
解决方案,但我只想从另一个角度提供备选解决方案。并且,取决于用例——例如,如果OP在创建用户之前检查是否存在同名用户,则两种解决方案都有权存在。如果是这种情况,则减少到数据库的往返次数。感谢您的反馈。我的观点只是警告读者不要盲目应用EAFP习惯用法——Python开发人员非常熟悉这种习惯用法——而不仔细考虑与数据库的交互。我同意您的观点,对于某些用例,这将是更有效的解决方案。