Django get_or_create尝试创建行,抛出IntegrityError?

Ric*_*ard 0 django django-models

我在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]
    )
Run Code Online (Sandbox Code Playgroud)

但当我尝试运行时,我得到:

django.db.utils.IntegrityError: duplicate key value violates unique constraint
DETAIL:  Key (code)=(A82057) already exists
Run Code Online (Sandbox Code Playgroud)

这是关于什么的?我认为重点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']
Run Code Online (Sandbox Code Playgroud)

是否与我设置手动主键的事实有关?我在Django文档中看不到有关此限制的任何内容.

Dan*_*man 5

get_or_create尝试使用您传递的所有参数,而不仅仅是PK.因此,如果存在具有匹配PK但具有不同邮政编码的对象,则get将失败,因此将尝试创建 - 但是,由于您具有手动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]
    })
Run Code Online (Sandbox Code Playgroud)