按不同模型对对象分组

2024-05-13 01:54:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型:

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选项提供一个项目。
例如,Combo#1有两个选项:

  1. 破布,布朗姆
  2. 勺子

因此,如果我们的订单有2块抹布,1把扫帚和2勺,我们将得到2个组合和一把扫帚作为项目

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

升级版本:

class Item(models.Model):
    name = models.CharField(max_length=300)
    price = models.DecimalField

项目-是一个产品。每个选择模型都有几个项目。例如,我们有两种选择的快餐套餐。精选饮料有两种——咖啡和茶。精选套餐包括鸡肉和汉堡包。因此,如果我们买两杯咖啡和一个汉堡包,我们就买一份套餐(因为咖啡适合第一选择,汉堡包适合第二选择)和一份额外的咖啡(因为没有汉堡包鸡肉)。如果我们有2杯咖啡、1个汉堡包和1只鸡肉,我们应该分两份点同样的套餐(咖啡+汉堡包和咖啡+鸡肉)


Tags: 项目模型modelonmodels选项itemprice
1条回答
网友
1楼 · 发布于 2024-05-13 01:54:02

你可以这样做:

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的基本过滤器不可能实现这一点

相关问题 更多 >