Django:在添加之前检查对象是否已存在

时间:2009-11-30 17:26:40

标签: python django

这是一个非常简单的Django问题,但是我在Django文档中找不到答案,尽管有很多狩猎!

如何检查某个对象是否已存在,只有在已存在的情况下才添加该对象?

这是代码 - 如果已经存在,我不想在数据库中添加两次follow_role。我该如何先检查?使用get()可能 - 但是如果get()没有返回任何内容,Django会抱怨吗?

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

谢谢!

5 个答案:

答案 0 :(得分:38)

你的模特经理在这个成语中有一个名为'get_or_create'的辅助函数:

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

它返回一个(model,bool)元组,其中'model'是你感兴趣的对象,'bool'告诉你是否必须创建它。

答案 1 :(得分:4)

如果您使用的是最新版本的Django,则可以使用UserToUserRole模型的unique_together选项,然后使用Joe Holloway显示的get_or_create()方法。这将保证您无法获得重复。

答案 2 :(得分:1)

如果您正在寻找bool值

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

答案 3 :(得分:0)

如果您想在每次保存之前完成检查,可以使用预保存信号进行检查,http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save

或者在模型中,您可以为确定项是否是同一项的属性指定unique = True,如果您尝试再次保存相同的项,将导致抛出异常(django.db.IntegrityError)

如果你有多个字段在一起使某些东西变得独特,你需要在Meta内部类http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together中使用unique_together

答案 4 :(得分:0)

你可以使用get(),但你必须用try-except包装它,除非像这样:

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