python - django.db.utils.IntegrityError: FOREIGN KEY 约束失败
问题描述
我的模型.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
状态模型编辑
也许问题就在这里。在我添加了一些您可以在评论中看到的代码后,问题就出现了。“最后一个错误表明 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
(or user_id
) 或status
(or status_id
) 引用了相关数据库表中不存在的实例。
你确定有一个状态pk=1
吗?手术Status.objects.get(pk=1)
成功了吗?
推荐阅读
- environment-variables - Apache check if user is browsing their home directory
- hbase - Geomesa BBOX Query is not returning all results
- php - How to apply a session value to drop down list using blade in Laravel
- python - When I try to run the 'MountainCar-v0' gym from Open AI, all I get is a black screen
- ruby-on-rails - 将上传的文件从 Active Storage 迁移到 Carrierwave
- bash - 要对我可用的文档中列出的每个单词进行排序和列出,我需要从文件中过滤掉空格
- machine-learning - Issue with multilabel classification
- python - Optimizing a custom conv2d layer in tf.keras
- django - Critical worker timeout
- c - 这两个数组声明有什么区别?