好的,这里是行为的解释。
1。我通过管理面板创建一个新的Post
对象。
2。对象已保存。
3。之后再创建一个Post
对象。
4。获取错误
django.db.utils.IntegrityError:重复的键值违反了唯一约束“ lp_post_pkey”详细信息:键(id)=(5de7b062-14b2-42ef-a9ee-95bbb17ccf3b)已经存在。
我已阅读duplicate key value violates unique constraint in django。
问题可能与正在使用的表中的主键序列不同步。解决此问题的方法是将当前Primary Key
设置为最大值+1。
但是我使用uuid作为主键,这可能不是我的解决方案。
所以,如果问题确实出在那,我该如何同步我的主键?
Btw,当我重置local server
时,我可以从1-4开始重复步骤。
同样,当我执行manage.py makemigrations
时,即使没有任何要迁移的地方,我也注意到,我的uuid字段不断更改为新字段。问题可以以某种方式关联吗?
models.py
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']
完整回溯
追踪(最近一次通话):文件“ /venv/lib/python3.7/site-packages/django/db/backends/utils.py”,_execute中的第86行返回self.cursor.execute(sql,params)psycopg2.errors.UniqueViolation:重复的键值违反唯一约束“ lp_post_pkey”详细信息:键(id)=(5de7b062-14b2-42ef-a9ee-95bbb17ccf3b)已经存在。
我最近的2次迁移
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。