【问题标题】:Django: check whether an object already exists before addingDjango:在添加之前检查对象是否已经存在
【发布时间】:2010-12-21 17:26:45
【问题描述】:

如何检查一个对象是否已经存在,如果它已经存在才添加它?

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

    在您的模型管理器上有一个名为“get_or_create”的习语的辅助函数:

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

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

    【讨论】:

    • 太棒了。解决问题。谢谢!是否有一个逆函数来检查一个对象是否存在,如果存在则删除它,如果不存在则什么都不做?
    • 我不知道有一个辅助函数,但我认为您可以通过执行 UserToUserRole.objects.filter(...).delete() 来接近。但是,这不会让您检查对象是否实际存在。您必须在删除之前检查查询集上的 count() 。当然,您可以查看 get_or_create 源代码并轻松创建自己的辅助函数。
    • 注意:exists() 应该比count() 快​​一点:)
    • exists() 一定是刚刚出版的,我不知道 exists() 存在。
    • @Joe:从技术上讲,exists() 现在甚至还没有出版。它是一个月前提交的,将在 Django 1.2 (code.djangoproject.com/changeset/11646)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您希望每次保存前都进行检查,您可以使用预保存信号进行检查,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】:

        你可以使用 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
        

        【讨论】:

          【解决方案5】:

          如果您正在寻找布尔值

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-16
            • 1970-01-01
            • 2013-06-14
            • 2011-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多