本文介绍了django.db.utils.IntegrityError:FOREIGN KEY约束失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 models.py

 类订单(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,默认=无)
customer_phone = models.CharField(max_length = 48,blank = True,null = True,默认=无)
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)#所有产品的总价顺序
注释= models.TextField(空白= True,null = True,默认=无)
status = models.ForeignKey(Status,on_delete = models.PROTECT)
created =模型。 DateTimeField(auto_now_add = True,auto_now = False)
已更新= models.DateTimeField(auto_now_add = False,auto_now = True)

def __str __(sel f):
返回Заказ%s%s%(self.id,self.status.name)

类元:
verbose_name =Заказ
verbose_name_plural =Заказы

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

我的 views.py

  def结帐(请求):
session_key = request.session.session_key
products_in_basket = ProductInBasket.objects .filter(session_key = session_key,is_active = True)
form = CheckoutContactForm(request.POST或None)
如果有请求.POST:
print(request.POST)
如果有.is_valid():
print( OK)
data = request.POST
name = data.get( name, 34343434)
phone = data [ phone]
用户,已创建= User.objects.get_or_create(username = phone,默认值= { first_name:name})

order = Order.objects.create(user =用户,customer_name =名称,customer_phone =电话,status_id = 1)
用于名称,data.items()中的值:如果name.startswith( product_in_basket _):
product_in_basket_id = name .split( product_in_basket _)[1]
product_in_basket = ProductInBasket.objec ts.get(id = product_in_basket_id)

product_in_basket.nmb =值
product_in_basket.order =订单
product_in_basket.save(force_update = True)

ProductInOrder.objects.create(
product = product_in_basket.nmb,
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())

错误:

 跟踪(最近一次通话最近):
文件 C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-
32\ \lib\站点软件包packagedjango-2.1rc1-py3.7.egg\django\内核b处理程序responseexception.py,内部
响应中的第34行= get_response(request)
文件 C:\Users\Nikita Shuliak\AppData\Local\Programs \Python\Python37-32\库站点包\django-2.1rc1-py3.7.egg\django\core\handlers\base.py,第126行,在_get_response
response = self.process_exception_by_middleware(e,request)
文件 C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib\ site-packages\django-2.1rc1-py3.7.egg\django\core\handlers\base.py,第124行,位于_get_response
response = wrapped_callback(request,* callback_args,* * callback_kwargs)
文件 C:\Users\Nikita Shuliak\Desktop\NJB\startup\orders\views.py,第59行,结帐
order = Order。 objects.create(用户=用户,客户名称=名称,客户电话=电话,status_id = 1)
文件 C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37 -32\lib\site-packages\django-2.1rc1-py3.7.egg\django\db\utils.py,第89行,在__exit__
中从exc_value
中提高dj_exc_value.with_traceback(traceback)文件 C:\Users\Nikita Shuliak\AppData\Local\Programs\Python\Python37-32\lib 站点软件包 django-2.1rc1-py3.7.egg django db后端 base base.py,第239行,在_commit
中返回self.connection。 commit()
django.db.utils.IntegrityError:外键约束失败

状态模型编辑



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

  class Status(models.Model):
名称= models.CharField(max_length = 16,空白= True,null = True,默认=无)
is_active =模型.BooleanField(默认=真)
创建=模型.DateTimeField(auto_now_add =真,auto_now = False)
更新= models.DateTimeField(auto_now_add = False,auto_now = True)

def __str __(self):
返回Статус%s%self.name


解决方案

该错误在行中:

  order = Order.objects.create(用户=用户,客户名称=名称,客户电话=电话,状态ID = 1)


我可以纠正,它可以工作;参见。



您的错误可能是因为code> user (或 user_id )或 status (或 status_id )正在引用相关数据库表中不存在的实例。



您确定状态为 pk = 1


操作 Status.objects.get(pk = 1)是否成功?

My models.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)

My 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())

The error:

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

STATUS MODEL EDDIT

Maybe problem is here. The problem is appeared after i added some code which you can see in comments. "This last error suggests that the Status with pk=1 already exists, but your previous error suggests the contrary. Please add your Status model to your question; lets see if there are any other conditions to consider.":

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
解决方案

The error is in the line:

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

I stand corrected, it can work; see this post.

Your error probably happens because either user (or user_id) or status (or status_id) are referencing instances that don't exist in the related database table.

Are you sure that there is a status with pk=1? Does the operation Status.objects.get(pk=1) succeed?

这篇关于django.db.utils.IntegrityError:FOREIGN KEY约束失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-18 22:13