为什么会抛出/add_to_cart/printedshirt/Field'id'处的错误'ValueError'预期为一个数字,但得到了'Red'?

2024-04-28 17:31:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我犯了这个错误,不知道为什么会这样

ValueError at /add_to_cart/printed-shirt/

Field 'id' expected a number but got 'Green'.

我想给我的产品增加一些变化。因此,当我提交时,我打印用户通过写入print(request.POST.getlist('variations', []))选择的值,这些值返回为['Red', 'Medium']。 现在,我想看看购物车中是否已经存在与这些变化相匹配的产品。如果它存在,那么我会增加数量,如果它不存在,那么我会添加一个新项目。该错误正在线路上抛出

order_item_qs = order_item_qs.filter(

但我的代码似乎不起作用。有人能帮我吗?提前谢谢

My views.py:

@login_required
def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    variations = request.POST.getlist('variations', [])
    print(variations)

    minimum_variation_count = Variation.objects.filter(item=item).count()
    if len(variations) < minimum_variation_count:
        messages.info(request, "Please specify the required variations.")


    order_item_qs = OrderItem.objects.filter(
        item=item,
        user= request.user,
        ordered=False,
    )

    for v in variations:
        order_item_qs = order_item_qs.filter(
            item_variations__exact=v
        )

    if order_item_qs.exists():
        order_item = order_item_qs.first()
        order_item.quantity += 1
        order_item.save()
    else:
        order_item = OrderItem.objects.create(
            item=item,
            user= request.user,
            ordered=False,
        )

        order_item.item_variations.add(*variations)
        order_item.save()

    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        if not order.items.filter(item__id=order_item.id).exists():
            order.items.add(order_item) 
            messages.success(request, "Product added to cart.")
            return redirect("order-summary")
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
        messages.success(request, "Product added to cart.")
        return redirect("order-summary")
    return redirect("order-summary")

My models.py:

class Item(models.Model):
   title = models.CharField(max_length=120)
   price = models.FloatField()

class Variation(models.Model):
   item = models.ForeignKey(Item, on_delete=models.CASCADE)
   name = models.CharField(max_length=50) # size, color

class ItemVariation(models.Model):
   variation  = models.ForeignKey(Variation, on_delete=models.CASCADE)
   value = models.CharField(max_length=50) # small, medium large etc

class OrderItem(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   item  = models.ForeignKey(Item, on_delete=models.CASCADE)
   item_variations = models.ManyToManyField(ItemVariation)
   quantity = models.IntegerField(default=1)
   ordered = models.BooleanField(default=False)

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

My order_summary.html(我可以在其中增加数量):

<a href="{% url 'remove-single-item-from-cart' order_item.item.slug %}" class="btn mr-2"><i class="fa fa-minus"></i></a>
{{ order_item.quantity }}<a href="{% url 'add-to-cart' order_item.item.slug %}" class="btn ml-2"><i class="fa fa-plus"></i></a>

My URL.py:

path('add_to_cart/<slug>/', orders_views.add_to_cart, name='add-to-cart'),
path('remove_from_cart/<slug>/', orders_views.remove_from_cart, name='remove-from-cart'),

Tags: toaddobjectsmodelsrequestorderfilteritem
1条回答
网友
1楼 · 发布于 2024-04-28 17:31:16

没有更多的信息很难确定,所以我会问一些额外的问题:

  1. 抛出错误的是哪一行
  2. 抛出错误时slug的值是多少?(没有看到顶部张贴的url)
  3. 什么是OrderItem型号

原始答案:

话虽如此,我认为错误在于这一行:order_item.item_variations.add(*variations)。 我认为,变异是['Green', ...]。我觉得在当前的模型设置中可能会出现类似order_item.item_variations.add(item.variation_set.filter(item_variation__value=...).first().pk)的情况。我认为这是因为它看起来不像ItemVariation的值,而是add作为参数(或实例)的主键

额外解释:

首先,我认为您检查商品是否已经在购物车中是错误的:

order_item_qs = order_item_qs.filter(
            item_variations__exact=v
        )

应该是:

order_item_qs = order_item_qs.filter(
            item_variations__value=v
        )

我将其更改为检查值,在该值中可以找到要比较的字符串。我想前一个是在检查身份证。我还删除了__exact,但意识到__exact隐含在固定版本中

第二,我认为您使用.add()来表示RelatedManager(您访问多对多字段的方式)是错误的。根据您的模型,ItemVariation没有在模型中设置主键。这意味着django将为您自动生成一个。^^自动生成的字段将是一个自动字段,它是一个int。这意味着为了使用OrderItem.item_variations.add(),您需要提供ItemVariation实例或ItemVariation的主键

目前,您为它提供了一组字符串。要解决此问题,您需要查询ItemVariations以获得正确的实例。我建议将order_item.item_variations.add(*variations)改为多行方法:

item_variations_to_add = ItemVariations.objects.filter(
    variation__item=item,
    value__in=variations
).values_list('id', flat=True)
order_item.item_variations.add(*item_variations_to_add)

这应该可以修复错误,尽管它确实存在一个潜在的问题,即如果数据库中没有这些变体,该怎么办。这是你应该考虑的另一个问题,但超出了这个答案的范围

^RelatedManager.add()文档: https://docs.djangoproject.com/en/dev/ref/models/relations/#django.db.models.fields.related.RelatedManager.add

^^自动主键文档: https://docs.djangoproject.com/en/dev/topics/db/models/#automatic-primary-key-fields

相关问题 更多 >