创建 Django 模型或更新(如果存在)

我想创建一个模型对象,比如 Person,如果 Person 的 id 不存在,或者我将得到那个 Person 对象。

创建新用户的代码如下:

class Person(models.Model):
identifier = models.CharField(max_length = 10)
name = models.CharField(max_length = 20)
objects = PersonManager()


class PersonManager(models.Manager):
def create_person(self, identifier):
person = self.create(identifier = identifier)
return person

但是我不知道在哪里检查并获取现有的 person 对象。

222452 次浏览

如果您正在寻找“ update If vis else create”用例,请参考 @ Zags 答得好


姜戈已经有了 get_or_createhttps://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

对你来说可能是:

id = 'some identifier'
person, created = Person.objects.get_or_create(identifier=id)


if created:
# means you have created a new person
else:
# person just refers to the existing one

Django 对此有支持,检查 获取或创建

person, created = Person.objects.get_or_create(name='abc')
if created:
# A new person object created
else:
# person object already exists

我想我应该加上一个答案,因为你的问题标题看起来像是询问如何创建或更新,而不是像问题正文中描述的那样获取或创建。

如果确实要创建或更新对象,则。Save ()方法默认情况下已经具有这种行为,来自 那些文件:

Django 抽象了使用 INSERT 或 UPDATESQL 语句的需要。 具体来说,当您调用 save ()时,Django 遵循以下算法:

如果对象的主键属性设置为计算 到 True (例如,一个值,而不是 Nothing 或空字符串) ,Django 如果未设置对象的主键属性,则执行一个 UPDATE 或者如果 UPDATE 没有更新任何内容,Django 将执行一个 INSERT。

值得注意的是,当他们说“如果 UPDATE 没有更新任何东西”时,他们实际上指的是您给出的对象 id 在数据库中不存在的情况。

目前还不清楚您的问题是要求使用 获取或创建方法(至少可以从 Django 1.3获得)还是 Update _ or _ create 更新或创建方法(Django 1.7中的新方法)。这取决于您希望如何更新用户对象。

样本用途如下:

# In both cases, the call will get a person object with matching
# identifier or create one if none exists; if a person is created,
# it will be created with name equal to the value in `name`.


# In this case, if the Person already exists, its existing name is preserved
person, created = Person.objects.get_or_create(
identifier=identifier, defaults={"name": name}
)


# In this case, if the Person already exists, its name is updated
person, created = Person.objects.update_or_create(
identifier=identifier, defaults={"name": name}
)

如果创建时的输入之一是主键,这就足够了:

Person.objects.get_or_create(id=1)

如果存在,它将自动更新,因为不允许两个数据具有相同的主键。

对于少量的对象,Update _ or _ create 更新或创建工作得很好,但是如果是在一个大的集合上工作,那么它的伸缩性就不会很好。Update _ or _ create 更新或创建总是首先运行 SELECT,然后运行 UPDATE。

for the_bar in bars:
updated_rows = SomeModel.objects.filter(bar=the_bar).update(foo=100)
if not updated_rows:
# if not exists, create new
SomeModel.objects.create(bar=the_bar, foo=100)

这最多只能运行第一个 update-query,并且只有当它匹配零行时才能运行另一个 INSERT-query。如果您期望大部分行实际上都存在,那么这将极大地提高性能。

不过这一切都取决于你的用例。如果您期望的主要是插入,那么 Mass _ create ()命令可能是一个选项。

这应该就是你要找的答案

EmployeeInfo.objects.update_or_create(
#id or any primary key:value to search for
identifier=your_id,
#if found update with the following or save/create if not found
defaults={'name':'your_name'}
)

您也可以像 get _ or _ create 一样使用 update _ or _ create,假设模型 Person 具有 id (key)、 name、 age、 is _ manager 作为属性-,那么下面是 update _ or _ create 的模式

update_values = {"is_manager": False}
new_values = {"name": "Bob", "age": 25, "is_manager":True}


obj, created = Person.objects.update_or_create(identifier='id',
defaults=update_values)
if created:
obj.update(**new_values)