Python 按不同模型对对象进行分组

Python 按不同模型对对象进行分组,python,django,Python,Django,我有两种型号: 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

我有两种型号:

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由链接到Combo的所有选项组成,要获得Combo价格,我们需要为每个Combo选项提供一个项目。 例如,Combo1对项目有两种选择:

布朗姆。 勺 因此,如果我们的订单有2块抹布、1把扫帚和2把勺子,我们将得到2个组合和一把扫帚作为商品

如何将订单拆分为组合和项目,使其具有2个查询集-一个用于组合,另一个用于未包含在组合中的Inems?谢谢

UPD:


项目-是一种产品。每个选择模型都有几个项目。例如,我们有两种选择的快餐套餐。精选饮料有两种:咖啡和茶。精选套餐包括鸡肉和汉堡包。所以,如果我们买两杯咖啡和一个汉堡包,我们就买一个套餐,因为咖啡适合第一选择,汉堡包适合第二选择,另外一杯咖啡是因为没有汉堡包鸡肉。如果我们有2个咖啡、1个汉堡包和1个鸡肉,我们应该将订单分成2个相同的组合:咖啡+汉堡包和咖啡+鸡肉。

您可以这样做:

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
您将得到两个列表:组合和不在组合中的项目。也许您需要稍微安排一下


如果你真的想使用Querysets,你必须在SQL中转换逻辑并生成一个,因为我认为用Django的基本过滤器无法实现这一点…

对不起,但我真的不明白你想做什么…@olinox14系统中有一些组合成本较低,然后单独列出项目。我需要检查订单中是否有组合,如果有组合,我需要将订单拆分为金额组合和金额项目。项目是什么?这些物品与连击有何关联?@olinox14选择型号m2m中的物品。像买抹布或扫帚和勺子之类的东西只需10美元。抹布和扫帚是Choice1对象中的项目,勺子是Choice2对象中的项目。您能用项目的定义更新您的问题吗?这将有助于更好地理解模型之间的关系。它返回Combo和Item对象的列表,之后您可以很容易地得到每个数量。。。
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