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)