我有两个模型:
class Combo(models.Model):
price = models.DecimalField
class Choice(models.Model):
combo = models.ForeignKey(Combo, on_delete=models.CASCADE)
items = models.ManyToManyField(Item)
我也有订购模型:
class Order(models.Model):
comment = models.CharField(max_length=300)
class OrderItem(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
amount = models.PositiveIntegerField
组合包含与组合相关的所有选择,并且要具有组合价格,我们需要为每个组合选择一个商品。
例如Combo#1有两个选择项:
因此,如果我们的订单有2个碎布,1个扫帚和2个勺子,我们将获得2个连击和1个扫帚作为物品。
如何将Order拆分为组合,将项拆分为2个QuerySet-一个用于Combo,另一个用于Inem,不包含在组合中?谢谢!
UPD:
class Item(models.Model):
name = models.CharField(max_length=300)
price = models.DecimalField
项目-是产品。每个Choice模型都有几个项目。例如,我们有2种选择的快餐组合。选择饮料有两个项目-咖啡和茶。精选餐点有-鸡肉和汉堡包。因此,如果我们购买2个咖啡和一个汉堡包,我们将购买1个组合(因为咖啡适合第一选择,汉堡适合第二选择)和1个额外的咖啡(因为没有汉堡包)。如果我们有2个咖啡,1个汉堡包和1个鸡肉,则应将订单拆分为2个相同的组合(咖啡+汉堡包和咖啡+鸡肉)。
答案 0 :(得分:1)
您可以使用类似这样的内容:
class Order(models.Model):
comment = models.CharField(max_length=300)
def get_combos(self):
combos = []
for combo in Combo.objects.all():
for choice in combo.choices:
if not any(item in self.order_items for item in choice.items):
break
else:
combos.append(combo)
orphans = {item.name: item for item in self.order_items}
for combo in combos:
for choice in combo.choices:
for item in choice.items:
if item.name in orphans:
del orphans[item.name]
break
return combos, orphans
您将获得两个列表:combos
和items
不在组合中(也许您需要对其进行一些排列)。
如果您真的想使用Querysets(),则必须在SQL中转换逻辑并制作一个raw query,因为我认为使用Django的基本过滤器无法实现这一点。 ..