如何解决如何在Views.py中进行变体以添加到购物车功能
-
我只需要使添加到购物车中的内容具有变化性,例如S,M,L
-
这不是Django Rest Framework,我只想使用Django
-
我没有适用于该版本的表格,如果有错,请您帮我
-
我正在关注JustDjango Ecommerce,但我正在使用代码构建自己的网站,并尝试仅使用Django添加一些变体。不使用Django Rest Framework
class Food(models.Model): class NewManager(models.Manager): def get_queryset(self): return super().get_queryset() .filter(avail=True) title = models.CharField(max_length=100) price = models.DecimalField(max_digits=5,decimal_places=2) discount_price = models.FloatField(blank=True,null=True) category = models.ForeignKey(Category,on_delete=models.CASCADE,blank=True,null=True) Package = models.ForeignKey(Pack,null=True) per = models.CharField(choices=PR,max_length=2,null=True) top = models.BooleanField(_('Top Selling'),default=False) slug = models.SlugField() description = models.TextField() image = models.ImageField(blank=False,null=False) avail = models.BooleanField(_('Available'),default=True) navail = models.BooleanField(_('Not Available'),default=False) def __str__(self): return self.title class Variation(models.Model): item = models.ForeignKey(Food,on_delete=models.CASCADE) name = models.CharField(max_length=50) # size class Meta: unique_together = ( ('item','name') ) def __str__(self): return self.name class ItemVariation(models.Model): variation = models.ForeignKey(Variation,on_delete=models.CASCADE) value = models.CharField(max_length=50) # S,M,L attachment = models.ImageField(blank=True) class Meta: unique_together = ( ('variation','value') ) def __str__(self): return self.value class OrderItem(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) ordered = models.BooleanField(default=False) item = models.ForeignKey(Food,on_delete=models.CASCADE) item_variations = models.ManyToManyField(ItemVariation) quantity = models.IntegerField(default=1)
@login_required def add_to_cart(request,slug,*args,**kwargs): item = get_object_or_404(Food,slug=slug) variations = Variation.objects.all() minimum_variation_count = Variation.objects.filter(item=item).count() if len(variations) < minimum_variation_count: return redirect("resto:order") order_item_qs = OrderItem.objects.filter( item=item,user=request.user,ordered=False ) for v in variations: order_item_qs = order_item_qs.filter( Q(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,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) return redirect("resto:order") else: ordered_date = timezone.now() order = Order.objects.create( user=request.user,ordered_date=ordered_date) order.items.add(order_item) return redirect("resto:order")
I add a Variation name "Sugar" just for Example when I click Add to Cart this Error show up.
ValueError at /add-to-cart/item-1/
Cannot query "Sugar": Must be "ItemVariation" instance.
Request Method: GET
Request URL: http://127.0.0.1:8000/add-to-cart/item-1/
Django Version: 2.2
Exception Type: ValueError
Exception Value: Cannot query "Sugar": Must be "ItemVariation" instance.
Exception Location: C:\Users\Admin\djangoproj\cafe\cdc\lib\site-packages\django\db\models\sql\query.py in check_query_object_type,line 1065
Python Executable: C:\Users\Admin\djangoproj\cafe\cdc\Scripts\python.exe
Python Version: 3.8.3
Python Path:
['C:\\Users\\Admin\\djangoproj\\cafe\\src','C:\\Users\\Admin\\djangoproj\\cafe\\cdc\\Scripts\\python38.zip','c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32\\DLLs','c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32\\lib','c:\\users\\admin\\appdata\\local\\programs\\python\\python38-32','C:\\Users\\Admin\\djangoproj\\cafe\\cdc','C:\\Users\\Admin\\djangoproj\\cafe\\cdc\\lib\\site-packages','c:\\users\\admin\\djangoproj\\cafe\\cdc\\src\\django-oscar-cash-on-delivery']
Server time: Fri,25 Sep 2020 03:05:29 +0000
解决方法
仅在您的for循环下面尝试替换:
order_item_qs = order_item_qs.filter(
Q(item_variations__exact=v)
)
使用:
order_item_qs = order_item_qs.filter(item_variations__variation=v)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。