django.db.utils.IntegrityError: UNIQUE constraint failed:



我正在用django做审查api,但是我有一个问题。

models.py

from django.db import models
import uuid
# Create your models here.
from django.utils.text import slugify
class buildingData(models.Model):
building_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(unique=True, default=uuid.uuid1)
building_loc = models.CharField(max_length=50)
building_call = models.CharField(max_length=20)
building_time = models.CharField(max_length=50)
def save(self, *args, **kwargs):
self.slug = slugify(self.building_name)
return super().save(*args, **kwargs)

class reviewData(models.Model):
building = models.ForeignKey(buildingData, related_name='reviews', on_delete=models.CASCADE, null=False, blank=False)
review_content = models.TextField()
star_num = models.FloatField()

urls . py

from django.contrib import admin
from django.urls import path
from crawling_data.views import ReviewListAPI
from crawling_data.views import BuildingInfoAPI
urlpatterns = [
path('admin/', admin.site.urls),
path('api/buildingdata/', BuildingInfoAPI.as_view()),
path('api/buildingdata/<slug:slug>/', ReviewListAPI.as_view())
]

我正在用爬行收集数据,但是…

django.db.utils.IntegrityError: UNIQUE constraint failed: crawling_data_buildingdata.slug

这个错误发生。

我已经尝试删除迁移文件并再次迁移,但仍然不起作用。

是我的代码有任何问题,还是有其他方法来解决这个问题?

这是因为uid1是从您的机器ID和时间戳生成的,而您的机器ID保持不变,这就是为什么它们最后看起来非常相似的原因。您可以使用uuid4()来获得一个随机唯一的UUID。

来自@ZdaR的回答

你应该把第一个模型改成这样:

class buildingData(models.Model):
building_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(unique=True, default=uuid.uuid4)
building_loc = models.CharField(max_length=50)
building_call = models.CharField(max_length=20)
building_time = models.CharField(max_length=50)

你也可以使用你的段格作为主键:

slug = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

编辑:

我看见了你的保存功能。在您的保存函数中,您应该删除分段赋值。或者改成self.slug = None。如果您想从建筑物名称中获得一个段塞,则必须在模型中使用TextField或CharField:

slug = models.TextField(unique=True, default=uuid.uuid4)