首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cart.cart_id : NULL约束失败:

Cart.cart_id : NULL约束失败:
EN

Stack Overflow用户
提问于 2018-12-02 15:29:13
回答 3查看 972关注 0票数 0

我正试图创建一个电子商务网站。我需要一个‘购物车’应用程序,将产生一个购物车对象,将持有项目,用户想要购买。

但是,当向购物车添加项时,我得到:

IntegrityError at /cart/add/3/ NULL约束失败: Cart.cart_id

Cart对象将有一个ID,这将是用户的会话ID。

这是将获得会话ID的函数:

代码语言:javascript
复制
def _card_id(request):
    cart = request.session.session_key
    if not cart:
        cart = request.session.create()
        return cart

views.py

代码语言:javascript
复制
from django.shortcuts import render, redirect
from shop.models import Product
from .models import Cart, CartItem
from django.core.exceptions import ObjectDoesNotExist


# Create your views here.

def _card_id(request):
    cart = request.session.session_key
    if not cart:
        cart = request.session.create()
        return cart


def add_cart(request, product_id):
    product = Product.objects.get(id = product_id)
    try:
        cart = Cart.objects.get(cart_id = _card_id(request))
    except Cart.DoesNotExist:
        cart = Cart.objects.create(
            cart_id = _card_id(request)
        )

        cart.save()
    try:
        cart_item = CartItem.objects.get(product = product, cart = cart)
        cart_item.quantity += 1
        cart_item.save()
    except CartItem.DoesNotExist:
        cart_item = CartItem.objects.create(
            product = product,
            quantity= 1,
            cart = cart,
        )
        cart_item.save()
    return redirect('cart:cart_detail')


def cart_detail(request, total = 0, counter = 0, cart_items = None):
    try:
        cart = Cart.objects.get(cart_id = _card_id(request))
        cart_items =  CartItem.objects.filter(cart = cart, active=True)

        for cart_item in cart_items:
            total += (cart_item.product.price * cart_item.quantity)
            counter += cart_item.quantity
    except ObjectDoesNotExist:
        pass

    return render(request, 'cart.html', dict(cart_items = cart_items, total = total, counter = counter))

models.py:

代码语言:javascript
复制
from django.db import models
from shop.models import Product

# Create your models here.

class Cart(models.Model):
    cart_id = models.CharField(max_length=250, blank=True)
    date_added = models.DateField(auto_now_add=True)

    class Meta:
        db_table = 'Cart'
        ordering = ['date_added']

    def __str__(self):
        return self.cart_id


class CartItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    active = models.BooleanField(default=True)
    class Meta:
        db_table = 'CartItem'

    def sub_total(self):
        return self.product.price * self.quantity

    def __str__(self):
        return self.product

urls:

代码语言:javascript
复制
from django.urls import path
from . import views

app_name = 'cart'

urlpatterns = [
    path('add/<int:product_id>/', views.add_cart, name = 'add_cart'),
    path('', views.cart_detail, name = 'cart_detail'),
]

完全错误:

代码语言:javascript
复制
IntegrityError at /cart/add/3/
NOT NULL constraint failed: Cart.cart_id
Request Method: GET
Request URL:    http://127.0.0.1:8000/cart/add/3/
Django Version: 2.1.3
Exception Type: IntegrityError
Exception Value:    
NOT NULL constraint failed: Cart.cart_id
Exception Location: /home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py in execute, line 296
Python Executable:  /home/ogonzales/Escritorio/projects_envs/perfectcushion_env/bin/python
Python Version: 3.6.7
Python Path:    
['/home/ogonzales/Escritorio/web_proyects/perfectcushion',
 '/home/ogonzales/Escritorio/web_proyects/perfectcushion',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages',
 '/home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages/setuptools-39.1.0-py3.6.egg',
 '/home/ogonzales/Escritorio/projects_envs/perfectcushion_env/lib/python3.6/site-packages/pip-10.0.1-py3.6.egg',
 '/home/ogonzales/Escritorio/pycharm/helpers/pycharm_matplotlib_backend']
Server time:    Sun, 2 Dec 2018 15:21:38 +0000
EN

回答 3

Stack Overflow用户

发布于 2018-12-02 22:56:47

你需要在这里换衣服:

代码语言:javascript
复制
def _card_id(request):
    cart = request.session.session_key
    if not cart:
        request.session.create()  # it does not return anything. that is why `cart = request.session.create()` will not work
        cart = request.session.session_key
    return cart  # Ultimately return cart
票数 2
EN

Stack Overflow用户

发布于 2018-12-02 19:25:28

我认为您创建了该对象,并且在_cart_id函数能够触发之前的一小段时间内,该对象没有cart_id的值,这是不允许您指定模型的方式的。也许可以尝试将null=True添加到购物车模型中的cart_id字段中。这样,在_cart_id函数能够给出值之前,允许字段在短时间内为空。

代码语言:javascript
复制
cart_id = models.CharField(max_length=250, null=True, blank=True)
票数 0
EN

Stack Overflow用户

发布于 2021-06-17 18:23:22

试着改变这个

代码语言:javascript
复制
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)

代码语言:javascript
复制
cart = models.ForeignKey(Cart, on_delete=models.CASCADE,null=True)

对我来说,这就是问题所在

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53581719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档