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

我想创build一个模型对象,如Person,如果人的id不存在,或者我将获得该person对象。

创build一个新人的代码如下:

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 

但是我不知道要去哪里查看并获取现有的人物。

如果你正在寻找“update if exists else create”的用例,请参考@Zags优秀的答案


Django已经有一个get_or_create , https : 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 

目前还不清楚你的问题是否要求get_or_create方法(至less可以从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} ) 

Django支持这个,请检查get_or_create

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

以为我会添加一个答案,因为您的问题标题看起来像是问如何创build或更新,而不是按问题主体中所述获取或创build。

如果您确实想要创build或更新一个对象,默认情况下.save()方法已经具有这种行为,从文档 :

Django抽象出需要使用INSERT或UPDATE SQL语句。 具体来说,当你调用save()时,Django遵循这个algorithm:

如果对象的主键属性设置为一个值为True的值(即None或空string以外的值),Django将执行UPDATE。 如果对象的主键属性没有设置,或者UPDATE没有更新,Django会执行一个INSERT。

值得注意的是,当他们说'如果UPDATE没有更新任何东西',它们实质上是指你给这个对象的id在数据库中不存在的情况。

如果你创build的时候其中一个input是主键,这就足够了:

 Person.objects.get_or_create(id=1) 

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