簡體   English   中英

django.db.utils.IntegrityError:唯一約束失敗:

[英]django.db.utils.IntegrityError: UNIQUE constraint failed:

我正在用 django 審查 api,但我遇到了問題。

模型.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()

網址.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

出現此錯誤。

我試過刪除遷移文件並再次遷移,但仍然不起作用。

我的代碼有什么問題還是有其他方法可以解決這個問題?

這是因為 uuid1 是根據您的機器 ID 和時間戳生成的,並且您的機器 ID 保持不變,這就是為什么它們最后看起來非常相似。 您可以使用 uuid4() 來獲取隨機的唯一 UUID。

來自@ZdaR這個答案中的回答

您應該將第一個 model 更改為:

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)

編輯:

我看到你的存檔 function。在你的存檔 function 中,你應該刪除 slug 分配。 或者將其更改為self.slug = None 如果你想從建築物名稱中獲得一個 slug,你必須在 model 中使用 TextField 或 CharField:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM