2015-06-18 1 views
1

Здравствуйте, я имею такую ​​ситуацию в своих моделях:SQL и Джанго: Создание агрегации на уровне базы данных

class Package(models.Model): 
    name 

class SetOfItems(models.Model) 
    name 

class Item(models.Model): 
    package(FK) 
    setofitems(FK) 

И проблему я пытаюсь решить это для упрощения запросов от SetOfItems. Например. в случае, если мне нужно будет получить имя пакета из SetOfItems, мне нужно будет написать что-то вроде SetOfItems.objects.values ​​('item__package__name'), что на самом деле не работает, хорошо на сайте администратора (например, если я создаю дополнительный поле).

Итак, я ищу, чтобы хранить информацию о пакетах в модели SetOfItem, не делая прямого отношения (поскольку я думаю, что если я поставил FK, там будет страдать целостность данных, например, можно будет на упаковке внутри Item и еще один в SetOfItems).

Возможно, есть какая-то возможность иметь представление SQL или что-то вроде этого ... чтобы столбец таблицы автоматически был предварительно заполнен из другой таблицы? Или что-то другое?

ответ

1

Элемент представляет собой сквозной стол во многих отношениях между Пакетом и SetOfItems. Таким образом, вы должны объявить его как таковой:

class SetOfItems(models.Model): 
    packages = models.ManyToManyField(Package, through='Item') 

Это не изменяет фактическую структуру таблицы на всех, но это позволяет сделать my_package.setofitems.all().

+0

Ну, это вызовет довольно много запросов, если я захочу отобразить пакеты в SetOfItems admin –

+0

Вы имеете в виду в списке изменений? Если вы беспокоитесь об этом, переопределите 'get_queryset' для извлечения QuerySet, который использует' prefetch_related' для получения всех пакетов. –

+0

Не только это. Но и сделать что-то вроде разных. –

Смежные вопросы