通过不同模型对对象进行分组

时间:2019-06-20 07:28:03

标签: 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 = models.CharField(max_length=300)


class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    amount = models.PositiveIntegerField

组合包含与组合相关的所有选择,并且要具有组合价格,我们需要为每个组合选择一个商品。
例如Combo#1有两个选择项:

  1. Rag,Brom。
  2. 瓢。

因此,如果我们的订单有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个相同的组合(咖啡+汉堡包和咖啡+鸡肉)。

1 个答案:

答案 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

您将获得两个列表:combositems不在组合中(也许您需要对其进行一些排列)。

如果您真的想使用Querysets(),则必须在SQL中转换逻辑并制作一个raw query,因为我认为使用Django的基本过滤器无法实现这一点。 ..