django.db.utils.IntegrityError:外键约束失败

Nik*_*iak 11 python django foreign-keys django-models django-views

我的模型.py

\n\n
class Order(models.Model):\n    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.PROTECT)\n    customer_email = models.EmailField(blank=True, null=True, default=None)\n    customer_name = models.CharField(max_length = 64, blank=True, null=True, default=None)\n    customer_phone = models.CharField(max_length = 48, blank=True, null=True, default=None)\n    customer_address = models.CharField(max_length = 128, blank=True, null=True, default=None)\n    total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) #total price for all products in order\n    comments = models.TextField(blank=True, null=True, default=None)\n    status = models.ForeignKey(Status, on_delete=models.PROTECT)\n    created = models.DateTimeField(auto_now_add=True, auto_now=False)\n    updated = models.DateTimeField(auto_now_add=False, auto_now=True)\n\n    def __str__(self):\n        return "\xd0\x97\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7 %s %s" % (self.id, self.status.name)\n\n    class Meta:\n        verbose_name = "\xd0\x97\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7"\n        verbose_name_plural = "\xd0\x97\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd1\x8b"\n\n    def save(self, *args, **kwargs):\n        super(Order, self).save(*args, **kwargs)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的观点.py .

\n\n
def checkout(request):\n    session_key = request.session.session_key\n    products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)\n    form = CheckoutContactForm(request.POST or None)\n    if request.POST:\n        print(request.POST)\n        if form.is_valid():\n            print("OK")\n            data = request.POST\n            name = data.get("name", "34343434")\n            phone = data["phone"]\n            user, created = User.objects.get_or_create(username=phone, defaults={"first_name": name})\n\n            order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)\n            for name, value in data.items():\n                if name.startswith("product_in_basket_"):\n                    product_in_basket_id = name.split("product_in_basket_")[1]\n                    product_in_basket = ProductInBasket.objects.get(id=product_in_basket_id)\n\n                    product_in_basket.nmb = value\n                    product_in_basket.order = order\n                    product_in_basket.save(force_update=True)\n\n                    ProductInOrder.objects.create(\n                        product=product_in_basket.product, \n                        nmb=product_in_basket.nmb, \n                        price_per_item=product_in_basket.price_per_item, \n                        total_price=product_in_basket.total_price, \n                        order=order\n                    )\n\n        else:\n            print("ERROR")\n    return render(request, \'orders/checkout.html\', locals())\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误:

\n\n
Traceback (most recent call last):\n  File "C:\\Users\\Nikita Shuliak\\AppData\\Local\\Programs\\Python\\Python37- \n 32\\lib\\site-packages\\django-2.1rc1-py3.7.egg\\django\\core\\handlers\\exception.py",   line 34, in inner\n    response = get_response(request)\n  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\n    response = self.process_exception_by_middleware(e, request)\n  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\n    response = wrapped_callback(request, *callback_args, **callback_kwargs)\n  File "C:\\Users\\Nikita Shuliak\\Desktop\\NJB\\startup\\orders\\views.py", line 59, in checkout\n    order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)\n  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__\n    raise dj_exc_value.with_traceback(traceback) from exc_value\n  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\n    return self.connection.commit()\ndjango.db.utils.IntegrityError: FOREIGN KEY constraint failed\n
Run Code Online (Sandbox Code Playgroud)\n\n

状态模型编辑

\n\n

也许问题就出在这里。我添加了一些代码后出现了问题,您可以在评论中看到这些代码。“最后一个错误表明 pk=1 的 Status 已经存在,但您之前的错误表明相反。请将您的 Status 模型添加到您的问题中;让我们看看是否还有其他条件需要考虑。”:

\n\n
class Status(models.Model):\n    name = models.CharField(max_length = 16, blank=True, null=True, default=None)\n    is_active = models.BooleanField(default=True)\n    created = models.DateTimeField(auto_now_add=True, auto_now=False)\n    updated = models.DateTimeField(auto_now_add=False, auto_now=True)\n\n    def __str__(self):\n        return "\xd0\xa1\xd1\x82\xd0\xb0\xd1\x82\xd1\x83\xd1\x81 %s" % self.name\n
Run Code Online (Sandbox Code Playgroud)\n

Ral*_*alf 6

错误在行中:

order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)
Run Code Online (Sandbox Code Playgroud)

您必须传递该字段的状态实例,status因为它是一个ForeignKey字段。仅设置status_id为整数是行不通的。 我纠正了,它可以工作;看到这个帖子

发生错误的原因可能是user(or user_id) 或status(or status_id) 引用了相关数据库表中不存在的实例。

您确定有 的状态pk=1吗?手术Status.objects.get(pk=1)成功吗?