簡體   English   中英

django.db.utils.IntegrityError: FOREIGN KEY 約束失敗

[英]django.db.utils.IntegrityError: FOREIGN KEY constraint failed

我的模型.py

class Order(models.Model):
    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.PROTECT)
    customer_email = models.EmailField(blank=True, null=True, default=None)
    customer_name = models.CharField(max_length = 64, blank=True, null=True, default=None)
    customer_phone = models.CharField(max_length = 48, blank=True, null=True, default=None)
    customer_address = models.CharField(max_length = 128, blank=True, null=True, default=None)
    total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) #total price for all products in order
    comments = models.TextField(blank=True, null=True, default=None)
    status = models.ForeignKey(Status, on_delete=models.PROTECT)
    created = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return "Заказ %s %s" % (self.id, self.status.name)

    class Meta:
        verbose_name = "Заказ"
        verbose_name_plural = "Заказы"

    def save(self, *args, **kwargs):
        super(Order, self).save(*args, **kwargs)

我的views.py

def checkout(request):
    session_key = request.session.session_key
    products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)
    form = CheckoutContactForm(request.POST or None)
    if request.POST:
        print(request.POST)
        if form.is_valid():
            print("OK")
            data = request.POST
            name = data.get("name", "34343434")
            phone = data["phone"]
            user, created = User.objects.get_or_create(username=phone, defaults={"first_name": name})

            order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)
            for name, value in data.items():
                if name.startswith("product_in_basket_"):
                    product_in_basket_id = name.split("product_in_basket_")[1]
                    product_in_basket = ProductInBasket.objects.get(id=product_in_basket_id)

                    product_in_basket.nmb = value
                    product_in_basket.order = order
                    product_in_basket.save(force_update=True)

                    ProductInOrder.objects.create(
                        product=product_in_basket.product, 
                        nmb=product_in_basket.nmb, 
                        price_per_item=product_in_basket.price_per_item, 
                        total_price=product_in_basket.total_price, 
                        order=order
                    )

        else:
            print("ERROR")
    return render(request, 'orders/checkout.html', locals())

錯誤:

Traceback (most recent call last):
  File "C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37- 
 32\lib\site-packages\django-2.1rc1-py3.7.egg\django\core\handlers\exception.py",   line 34, in inner
    response = get_response(request)
  File "C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django-2.1rc1-py3.7.egg\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django-2.1rc1-py3.7.egg\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Nikita Shuliak\Desktop\NJB\startup\orders\views.py", line 59, in checkout
    order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)
  File "C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django-2.1rc1-py3.7.egg\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django-2.1rc1-py3.7.egg\django\db\backends\base\base.py", line 239, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed

狀態模型編輯

也許問題就在這里。 在我添加了一些您可以在評論中看到的代碼后,問題出現了。 “最后一個錯誤表明 pk=1 的狀態已經存在,但您之前的錯誤表明相反。請將您的狀態模型添加到您的問題中;讓我們看看是否還有其他條件需要考慮。”:

class Status(models.Model):
    name = models.CharField(max_length = 16, blank=True, null=True, default=None)
    is_active = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        return "Статус %s" % self.name

錯誤在一行中:

order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)

您必須為字段 status傳遞一個狀態實例,因為它是一個 ForeignKey字段。 僅將 status_id設置為整數是行不通的。 我糾正了,它可以工作; 看到這個帖子

您的錯誤可能是因為user (或user_id )或status (或status_id )正在引用相關數據庫表中不存在的實例。

你確定有pk=1的狀態嗎? 操作Status.objects.get(pk=1)成功?

嘗試將models.ForeignKey()db_constraint的命名參數設置為False (默認為True ),如下所示:

status = models.ForeignKey(Status, on_delete=models.PROTECT,db_constraint=False)

這在某個項目中對我有用,唯一的問題是您將無法確保數據庫的完整性(例如,知道引用的所有 Status 對象是否實際存在),但如果您使用的是遺留代碼,這很有意義。 希望能幫助到你。

我看到您沒有保存實例“訂單”。 ---- order.save()

我認為解決方案是保存要保存的實例。

今天,我收到了和你一樣的錯誤信息。 我意識到我忘記在我的代碼中保存一個實例。 我的代碼與你的代碼不同,但我認為你值得一試

我遇到了這個問題,因為我使用了錯誤的表格。 檢查表單的代碼。 if form.is_valid(): check 之后,我看不到你在哪里使用它。

暫無
暫無

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

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