Группировка объектов по разным моделям - PullRequest
0 голосов
/ 20 июня 2019

У меня есть две модели:

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. Rag, Brom.
  2. Совок.

Так что, если в нашем заказе 2 тряпки, 1 метла и 2 совка, мы получим 2 комбо и одну метлу в качестве предмета.

Как разделить ордер на комбо и предметы, чтобы иметь2 QuerySets - один для комбо и другой для Inems не включены в комбо?Спасибо!

UPD:

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

Товар - это товар.Есть несколько пунктов для каждой модели выбора.Например, у нас есть комбо для фастфуда с 2 вариантами.Выбор напитка состоит из двух предметов - кофе и чая.Выбор блюд есть пункты - курица и гамбургер.Поэтому, если мы покупаем 2 кофе и один гамбургер, мы покупаем одно комбо (потому что кофе подходит для первого выбора, а гамбургер подходит для второго выбора) и 1 дополнительный кофе (потому что для него нет курицы с гамбургером).Если у нас было 2 кофе, 1 гамбургер и 1 курица, мы должны разделить заказ на 2 одинаковых комбо (кофе + гамбургер и кофе + курица).

1 Ответ

1 голос
/ 20 июня 2019

Вы могли бы пойти с чем-то вроде этого:

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 и сделать необработанный запрос , потому что я не думаю, что будет возможно достичь этого с помощью Django базовые фильтры ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...