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

Python django.db.utils.IntegrityError:外键约束失败,python,django,django-models,django-views,foreign-keys,Python,Django,Django Models,Django Views,Foreign Keys,My型号.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, b

My型号.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)
我的视图.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
状态模型EDDIT

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

order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)
您必须为字段
status
传递一个状态实例,因为它是
ForeignKey
字段。仅仅将状态id设置为整数是行不通的。 我站着纠正,它可以工作;看

发生错误的原因可能是
user
(或
user\u id
)或
status
(或
status\u id
)正在引用相关数据库表中不存在的实例


您确定存在状态为
pk=1
?操作
Status.objects.get(pk=1)
成功吗?

我看到您没有保存实例“order”。--order.save()

我认为解决办法是保存待保存的Instance。 今天,我收到了与您相同的错误消息。我意识到我忘了在代码中保存一个实例。
我的代码与您的代码不同,但我认为您值得尝试

尝试将
模型的
db\u constraint
的命名参数设置为
False
(默认情况下为
True
):

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

这对我在某个项目上的工作是有效的。唯一的问题是,您将无法确保数据库的完整性(例如,知道引用的所有状态对象是否实际存在),但如果您使用的是遗留代码,这是有意义的。
希望有帮助。

请添加错误堆栈跟踪,以便我们了解实际问题。您粘贴了几行,但这与上下文无关,没有任何帮助。此外,将
null=True
CharField
一起使用是非常罕见的@拉尔夫,我加上完整的追踪。我该怎么办?如何修复此问题?操作
Status.objects.get(pk=1)
成功吗?如果
Status
实例不存在
pk=1
,您需要先创建它,或者将另一个
Status
实例分配给新的
订单
实例。状态匹配查询不存在OK。用
pk=1创建一个状态
或按
Order.objects指定一个不同的状态。创建(…,status_id=1)
我对英语没有信心。英语可能是错的(+++)
status = models.ForeignKey(Status, on_delete=models.PROTECT,db_constraint=False)