Django IntegrityError,以uuid作为primaryKey

Django IntegrityError with uuid as primaryKey

好的,这就是解释的行为。

1。我通过管理面板创建了一个新的Post对象。

2。对象已保存。

3。之后再创建一个Post对象。

4。取得错误

django.db.utils.IntegrityError: duplicate key value violates unique
constraint"lp_post_pkey" DETAIL: Key
(id)=(5de7b062-14b2-42ef-a9ee-95bbb17ccf3b) already exists.

我读取了重复的键值,违反了django中的唯一约束。

问题可能与我正在使用的表中的主键序列不同步相同。解决方案是将电流Primary Key设置为最大值1。

但是我使用uuid作为主键,这可能不是我的解决方案。

那么,如果问题确实出在那,我该如何同步我的主键?

顺便说一句,当我重设local server时,我可以重复1-4的步骤。

同样,我已经注意到当我执行manage.py makemigrations时,即使我没有什么要迁移的,我的uuid字段也会不断更改为新字段。问题可以以某种方式关联吗?

models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class SubscriberModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4(), unique=True, editable=False)
    email = models.EmailField()
    subscribed = models.DateTimeField(default=timezone.now())
    ip_addr = models.CharField(null=False, max_length=250, default="")
    objects = models.Manager()

    def __str__(self):
        return"{%s}/EMAIL\\{%s}/\\Subscribed On/\\{%s}/\\From this IP" % \\
               (self.email, self.subscribed, self.ip_addr)

    class Meta:
        unique_together = ('email', 'ip_addr')


class ContactUsModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4(), unique=True, editable=False)
    name = models.CharField(max_length=150, null=False)
    email = models.EmailField()
    body = models.TextField()
    ip_addr = models.CharField(null=False, max_length=250, default="")
    date = models.DateTimeField(default=timezone.now())
    objects = models.Manager()

    def __str__(self):
        return 'mail from {%s} | at {%s}' % (self.email, self.date)

    class Meta:
        unique_together = ('email', 'ip_addr')


def save_image(title, filename):
    return '{%s}-{%s}' % (title, filename)


class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4(), unique=True, editable=False)
    title = models.CharField(max_length=250)
    body = models.TextField()
    main_image = models.ImageField(null=False, upload_to=save_image)
    second_image = models.ImageField(blank=True, default="")
    third_image = models.ImageField(blank=True, default="")
    fourth_image = models.ImageField(blank=True, default="")
    fifth_image = models.ImageField(blank=True, default="")
    created_at = models.DateTimeField(default=timezone.now())

    # get url

    def slug(self):
        return slugify(self.title)

    def get_absolute_url(self):
        return reverse('lp:post_detail', kwargs={'slug': self.slug(),
                                                 'pk': self.pk})

    def __str__(self):
        return '%s' % self.title

    class Meta:
        ordering = ['-created_at']

完整回溯

Traceback (most recent call last): File
"/venv/lib/python3.7/site-packages/django/db/backends/utils.py",
line 86, in _execute
return self.cursor.execute(sql, params) psycopg2.errors.UniqueViolation: duplicate key value violates unique
constraint"lp_post_pkey" DETAIL: Key
(id)=(5de7b062-14b2-42ef-a9ee-95bbb17ccf3b) already exists.

我最近的2次迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Migration(migrations.Migration):

    dependencies = [
        ('lp', '0008_auto_20191221_2016'),
    ]

    operations = [
        migrations.AlterField(
            model_name='contactusmodel',
            name='date',
            field=models.DateTimeField(default=datetime.datetime(2019, 12, 21, 20, 17, 10, 770047, tzinfo=utc)),
        ),
        migrations.AlterField(
            model_name='contactusmodel',
            name='id',
            field=models.UUIDField(default=uuid.UUID('37e52230-3c82-45eb-bbb9-aeb432b12247'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='post',
            name='created_at',
            field=models.DateTimeField(default=datetime.datetime(2019, 12, 21, 20, 17, 10, 770612, tzinfo=utc)),
        ),
        migrations.AlterField(
            model_name='post',
            name='id',
            field=models.UUIDField(default=uuid.UUID('f4e05be4-2722-47b2-b636-232079114157'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='subscribermodel',
            name='id',
            field=models.UUIDField(default=uuid.UUID('61b77cb5-5f33-4b8b-b235-83d3b10cc989'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='subscribermodel',
            name='subscribed',
            field=models.DateTimeField(default=datetime.datetime(2019, 12, 21, 20, 17, 10, 741394, tzinfo=utc)),
        ),
    ]


class Migration(migrations.Migration):

    dependencies = [
        ('lp', '0007_auto_20191221_2004'),
    ]

    operations = [
        migrations.AlterField(
            model_name='contactusmodel',
            name='date',
            field=models.DateTimeField(default=datetime.datetime(2019, 12, 21, 20, 16, 18, 987126, tzinfo=utc)),
        ),
        migrations.AlterField(
            model_name='contactusmodel',
            name='id',
            field=models.UUIDField(default=uuid.UUID('fabeec4c-bdd0-443a-81e9-2ea0ba8c8f4b'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='post',
            name='created_at',
            field=models.DateTimeField(verbose_name=datetime.datetime(2019, 12, 21, 20, 16, 18, 987702, tzinfo=utc)),
        ),
        migrations.AlterField(
            model_name='post',
            name='id',
            field=models.UUIDField(default=uuid.UUID('aafc7ac3-f48b-4a74-a9cd-2af3a8d3fcae'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='subscribermodel',
            name='id',
            field=models.UUIDField(default=uuid.UUID('b9c2a42c-3265-4a13-af48-ff5db4f38d30'), editable=False, primary_key=True, serialize=False, unique=True),
        ),
        migrations.AlterField(
            model_name='subscribermodel',
            name='subscribed',
            field=models.DateTimeField(default=datetime.datetime(2019, 12, 21, 20, 16, 18, 958998, tzinfo=utc)),
        ),
    ]

您的问题是您将默认值设置为uuid.uuid4()。当应用程序首次启动时,这将创建一个id,然后尝试对每个帖子使用相同的id。

解决方案是使用不带括号的default=uuid.uuid4。这将自动为每条记录执行该函数,从而生成一个新的uuid。