django - 检查字符串是否存在于多对一关系中
问题描述
我尝试在 Django 中编写一个简单的 Shopping-Cart 并具有以下模型:
class Product(models.Model):
name = models.CharField(max_length=256)
serial = models.CharField(max_length=128)
def __str__(self):
return self.name
class Cart(models.Model):
user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
products = models.ManyToManyField(Product, blank=True)
updated = models.DateTimeField(auto_now=True)
timestamp = models.DateTimeField(auto_now_add=True)
objects = CartManager()
def __str__(self):
return str(self.id)
class CartEntry(models.Model):
product = models.ForeignKey(Product, null=True, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, null=True, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
def __str__(self):
return str(self.id)
我将如何检查产品的 CartEntry 是否已经存在,所以当它已经存在时我可以增加数量 +1,或者在它不存在时创建 CartEntry?
我想这样的事情:
def cart_update(request, id):
product_id = id
my_cart_id, my_cart = Cart.objects.get_or_create(user=request.user)
product_obj = Product.objects.get(id=product_id)
product_quantity = "1"
for item in CartEntry.objects.filter(cart=my_cart_id):
#check all products in CartEntry if it already exists
if not item.product.exists():
#Product does not exists yet - creating a CartEntry
CartEntry.objects.create(cart=my_cart_id, product=product_obj, quantity=product_quantity)
else:
#Product does exists - incrementing the quantity
return HttpResponseRedirect(reverse('list-products'))
解决方案
我想我明白了:
class CartEntry(models.Model):
product = models.ForeignKey(Product, null=True, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, null=True, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
def __str__(self):
return str(self.product.name)
-
from django.db.models import F
def cart_update(request, id):
product_id = id
my_cart_id, my_cart_created = Cart.objects.get_or_create(user=request.user)
product_obj = Product.objects.get(id=product_id)
product_quantity = "1"
items_in_cart = CartEntry.objects.filter(cart=my_cart_id)
# if no products in cart, add product
if not items_in_cart:
CartEntry.objects.create(cart=my_cart_id, product=product_obj, quantity=product_quantity)
else:
# if product already exists in Cart, increment quantity +1
if CartEntry.objects.filter(cart=my_cart_id).filter(product=product_obj):
CartEntry.objects.filter(cart=my_cart_id, product=product_obj).update(quantity=F('quantity')+1)
else:
# product does not exist in Cart -> add it with quantity 1
CartEntry.objects.create(cart=my_cart_id, product=product_obj, quantity=product_quantity)
return HttpResponseRedirect(reverse('list-products'))
当然欢迎编辑或其他(更好的)解决方案。
推荐阅读
- encryption - 使用 CryptoJS 解码(Base64)和解密(AES/CBC/PKCS5PADDING) - React
- machine-learning - 如何使用 seq2seq 解码连接的字符串
- jsf - 如何为 JSF 实现一个好的转换器?
- javascript - Node.js 与 Python 中的剩余部分
- python - Quandl 返回的 Numpy 数据中的三个点
- mysql - 错误“无法启动 mariadb.service:未找到单元 mariadb.service”
- reactjs - 使用 React 状态来允许临时无效的数字输入
- angular - 在处理请求时挂断应用程序
- vhdl - 如何修复 [ 在 "then": (vcom-1576) 期望 == 或 '+' 或 '-' 或 '&' ] 错误?
- python - 在使用迁移学习进行对象检测的序列模型训练期间,训练和验证准确度保持不变