繁体   English   中英

/add-to-cart/test2/ NOT NULL 约束的 IntegrityError 失败:core_order.items_id

[英]IntegrityError at /add-to-cart/test2/ NOT NULL constraint failed: core_order.items_id

问题可能出在 add_to_cart() 方法中的 views.py 文件中。 此方法使用来自 models.py 的 3 个类

这是我的 views.py 文件

from django.shortcuts import render
from .models import Item, Order, OrderItem
from django.views.generic import ListView, DetailView
from django.shortcuts import reverse, get_object_or_404, redirect
from django.utils import timezone


class HomeView(ListView):
    model = Item
    template_name = 'home-page.html'


class ItemView(DetailView):
    model = Item
    template_name = 'product.html'


def checkout(request):
    context = {
        'items': Item.objects.all()
    }
    return render(request, 'checkout-page.html', context)


def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    order_item = OrderItem.objects.create(item=item)
    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if order.items.filter(item__slug=item.slug).exists():
            order_item.quantity += 1
            order_item.save()
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(
            user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        return redirect("core:product",
                        slug=slug)

我的models.py 文件。 订单类 id 造成了问题。 异常值:NOT NULL 约束失败:core_order.items_id 异常类型:IntegrityError

from django.conf import settings
from django.db import models
from django.shortcuts import reverse, get_object_or_404, redirect

Categoty_choice = (
    ('s', 'Shirt'),
    ('sw', 'Sport Wear'),
    ('o', 'Outwear')
)

Label_choice = (
    ('p', 'primary'),
    ('s', 'secondary'),
    ('d', 'danger')
)


class Item(models.Model):
    title = models.CharField(max_length=100)
    price = models.FloatField()
    discount_price = models.FloatField(blank=True, null=True)
    category = models.CharField(choices=Categoty_choice, max_length=2)
    label = models.CharField(choices=Label_choice, max_length=1)
    slug = models.SlugField()
    description = models.TextField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("core:product", kwargs={"slug": self.slug})

    def get_add_to_cart_url(self):
        return reverse("core:add_to_cart", kwargs={"slug": self.slug})


class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return self.item


class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    items = models.ForeignKey(OrderItem, on_delete=models.CASCADE)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return self.user.username

urls.py 文件。 有些模式是 CBV,有些模式是正常的

from django.urls import path
from . import views

app_name = 'core'
urlpatterns = [
    path('', views.HomeView.as_view(), name='home'),
    path('product/<slug>/', views.ItemView.as_view(), name='product'),
    path('add-to-cart/<slug>/', views.add_to_cart, name='add_to_cart'),
    path('checkout/', views.checkout, name='checkout'),

]

您应该添加更多属性,例如 null = True, blank = True

class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, null=True, blank=True)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return self.item

我在迁移时没有将新字段设置为空白 = True,null = True。 因此,现有对象会抛出错误,因为它们在新添加的字段中没有任何值。 所以我打开 manage.py shell 并从该类中获取所有对象并单独删除所有对象。 然后把blank = True, null = True 添加到新添加的字段,我又迁移了。 然后再次添加对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM