【问题标题】:Group objects by different models按不同模型分组对象
【发布时间】:2019-06-20 18:02:08
【问题描述】:

我有两个模型:

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 个组合和一把扫帚作为物品。

如何将订单拆分为组合和项目以拥有 2 个查询集 - 一个用于组合,另一个用于不包含在组合中的 Inem?谢谢!

更新:

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

Item - 是一种产品。每个 Choice 模型都有几个项目。例如,我们有一个带有 2 个选项的快餐组合。选择饮料有两个项目 - 咖啡和茶。精选餐有项目 - 鸡肉和汉堡包。因此,如果我们购买 2 杯咖啡和 1 个汉堡包,我们将购买 1 个组合(因为咖啡适合第一选择,汉堡适合第二选择)和 1 杯额外咖啡(因为它没有鸡肉汉堡)。如果我们有 2 个咖啡、1 个汉堡和 1 个鸡肉,我们应该将订单拆分为 2 个相同的组合(咖啡 + 汉堡和咖啡 + 鸡肉)。

【问题讨论】:

  • 对不起,我真的不明白你在做什么......
  • @olinox14 系统中有一些组合成本更低,然后是单独的项目。我需要检查 Order 中是否有任何组合,如果有组合,我需要将我的订单拆分为 Combos with amount 和 Items with amount。
  • 什么是Items?这些物品与 Combos 有什么关系?
  • @olinox14 选择模型中的项目 (m2m)。诸如“购买抹布或扫帚和勺子”之类的东西只需 10 美元。 Rag 和 Broom 是 Choice#1 对象中的项目,Scoop 是 Choice#2 对象中的项目。
  • 你能用Item的定义更新你的问题吗?这将有助于更好地理解模型之间的关系。

标签: python django


【解决方案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 的基本过滤器不可能实现这一点......

【讨论】:

  • 它返回 Combo 和 Item 对象的列表,之后您可以轻松获取每个数量...
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多