Django.db.utils.IntegrityError: Ограничение UNIQUE не сработало:

Я делаю review api с помощью django, но у меня возникла проблема.

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

Возникает ошибка.

Я пробовал удалить файл migrate и снова выполнить миграцию, но все равно не работает.

Есть ли какая-то проблема в моем коде или есть другой способ решить это?

Это потому, что uuid1 генерируется из идентификатора машины и метки времени, а идентификатор машины в вашем случае остается постоянным, поэтому в конце они выглядят довольно похоже. Вы можете использовать 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 в качестве первичного ключа следующим образом:

slug = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Вернуться на верх