Django создает url со slug, но "django.db.utils.IntegrityError: UNIQUE constraint failed:" возникает ошибка

Я хочу сделать url с именем здания, используя slug.

ex) api/buildingdata/Abuilding

В этом url есть данные обзора.

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())
]

models.py

from django.db import models

# 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, allow_unicode=True)
    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, allow_unicode=True)
        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()

ошибки

File "c:\Users\admin\Desktop\crawler\crawling.py", line 190, in button_clicked
    crawling(search_key, search_cnt, file_name)
  File "c:\Users\admin\Desktop\crawler\crawling.py", line 133, in crawling
    buildingData(building_name = item['place'], building_loc = item['location'], building_call = item['call'], building_time = item['time']).save()
  File "c:\Users\admin\Desktop\crawler\crawling_data\models.py", line 17, in save
    return super().save(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\base.py", line 763, in save_base
    updated = self._save_table(
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\base.py", line 868, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\base.py", line 906, in _do_insert
    return manager._insert(
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\query.py", line 1270, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py", line 1416, in execute_sql
    cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py", line 423, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: crawling_data_buildingdata.slug

код сохранения данных в crawling.py

for item in building_dict:
            buildingData(building_name = item['place'], building_loc = item['location'], building_call = item['call'], building_time = item['time']).save()
        for item in review_dict:
            reviewData(building_name = item['place'], review_content = item['review'], star_num = item['rate']).save()

Если я не использую slug. Сохранение API работает нормально. Но если я использую slug, возникает ошибка UNIQUE constraint.

Я пробовал много вещей, чтобы решить эту ошибку (например, удалить миграцию и мигрировать снова), но пока не могу решить.

Я разместил тот же вопрос вчера, но решения не сработали для меня.

Есть ли что-нибудь, чтобы переписать код?

Ваш slug должен быть уникальным. Если slug является пустой строкой, то вы должны разрешить null в поле (по null=True) и затем использовать self.slug = slugify(self.building_name, allow_unicode=True) or None. Если вы хотите найти проблему, можете вывести

def save(self, *args, **kwargs):
    self.slug = slugify(self.building_name, allow_unicode=True)
    try:
        return super().save(*args, **kwargs)
    except:
        print(f"the repeated slug is: `{self.slug}`")
        raise
Вернуться на верх