Django get_or_create 试图创建行,抛出 IntegrityError?
Django get_or_create trying to create row, throwing IntegrityError?
我正在使用 Django 1.7 和 Postgres,并使用 ORM 创建一些新行。我正在使用 get_or_create
如下:
p, created = Practice.objects.get_or_create(
code=row[1],
name=row[2],
address1=row[3],
address2=row[4],
address3=row[5],
address4=row[6],
postcode=row[7]
)
但是当我尝试 运行 时,我得到:
django.db.utils.IntegrityError: duplicate key value violates unique constraint
DETAIL: Key (code)=(A82057) already exists
这是关于什么的?我认为 get_or_create
的目的是仅在新行不存在时才尝试创建新行。
我的模型是这样的:
class Practice(TimeStampedModel):
code = models.CharField(max_length=6, primary_key=True, db_index=True)
name = models.CharField(max_length=200)
address1 = models.CharField(max_length=200, null=True, blank=True)
address2 = models.CharField(max_length=200, null=True, blank=True)
address3 = models.CharField(max_length=200, null=True, blank=True)
address4 = models.CharField(max_length=200, null=True, blank=True)
postcode = models.CharField(max_length=9, null=True, blank=True)
def __str__(self):
return self.name
class Meta:
app_label = 'frontend'
ordering = ['name']
是不是和我设置了手动主键有关?我看不到任何关于此限制的内容 in the Django docs。
get_or_create
尝试使用您传递的 所有 参数进行获取,而不仅仅是 PK。因此,如果有一个对象具有匹配的 PK 但邮政编码不同,例如,get 将失败,因此将尝试创建 - 但是,由于您有手动 PK,它将尝试使用您的数据创建一个重复的 PK已经过去了。
一般来说,使用非自动增量 PK 是个坏主意。但是,如果您只是想仅查看 PK,请使用 defaults
参数:
p, created = Practice.objects.get_or_create(
code=row[1],
defaults={
'name': row[2],
'address1': row[3],
'address2': row[4],
'address3': row[5],
'address4': row[6],
'postcode': row[7]
})
我正在使用 Django 1.7 和 Postgres,并使用 ORM 创建一些新行。我正在使用 get_or_create
如下:
p, created = Practice.objects.get_or_create(
code=row[1],
name=row[2],
address1=row[3],
address2=row[4],
address3=row[5],
address4=row[6],
postcode=row[7]
)
但是当我尝试 运行 时,我得到:
django.db.utils.IntegrityError: duplicate key value violates unique constraint
DETAIL: Key (code)=(A82057) already exists
这是关于什么的?我认为 get_or_create
的目的是仅在新行不存在时才尝试创建新行。
我的模型是这样的:
class Practice(TimeStampedModel):
code = models.CharField(max_length=6, primary_key=True, db_index=True)
name = models.CharField(max_length=200)
address1 = models.CharField(max_length=200, null=True, blank=True)
address2 = models.CharField(max_length=200, null=True, blank=True)
address3 = models.CharField(max_length=200, null=True, blank=True)
address4 = models.CharField(max_length=200, null=True, blank=True)
postcode = models.CharField(max_length=9, null=True, blank=True)
def __str__(self):
return self.name
class Meta:
app_label = 'frontend'
ordering = ['name']
是不是和我设置了手动主键有关?我看不到任何关于此限制的内容 in the Django docs。
get_or_create
尝试使用您传递的 所有 参数进行获取,而不仅仅是 PK。因此,如果有一个对象具有匹配的 PK 但邮政编码不同,例如,get 将失败,因此将尝试创建 - 但是,由于您有手动 PK,它将尝试使用您的数据创建一个重复的 PK已经过去了。
一般来说,使用非自动增量 PK 是个坏主意。但是,如果您只是想仅查看 PK,请使用 defaults
参数:
p, created = Practice.objects.get_or_create(
code=row[1],
defaults={
'name': row[2],
'address1': row[3],
'address2': row[4],
'address3': row[5],
'address4': row[6],
'postcode': row[7]
})