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