姜戈 delete_or_create

Django delete_or_create

django ORM中有没有类似get_or_create的方法delete_or_create?

类似于:

p, deleted = Person.objects.create_or_delete(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# create_or_delete() has created the object
>>> deleted
False

p, deleted = Person.objects.create_or_delete(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# create_or_delete() has deleted the object as it does exist in the DB
>>> deleted
True

get_or_create 只做这个:

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
    created = False
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()
    created = True
return obj, created

您可以像这样实现自己的功能:

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
    # if obj exists delete
    obj.delete()
    deleted = True
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()
    deleted = False
return obj, deleted

也许 update-or-create 功能会对您有所帮助。这样,您可以用新信息覆盖旧条目或创建对象。

另一种方法,类似于前面的答案,是使用 exists() 函数,它检查查询是否为空:

if Person.objects.filter(first_name='John', last_name='Lennon').exists():
   obj = Person.objects.filter(first_name='John', last_name='Lennon')
   obj.delete()
else:
   obj = Person(first_name='John', last_name='Lennon')
   obj.save()

这样就避免了"try"行。