Я хочу построить с помощью django-mptt иерархию классов овощей (Фрукты -> Ягоды -> Клубника -> Клубника Дугласа), являющуюся последним уровнем разнообразия. Запасы розничных продавцов часто связаны с уровнем листа, сортом (Золотое яблоко, клубника Дугласа...), но потребители привыкли спрашивать о верхнем уровне (яблоко, груша, апельсин, салат...). Таким образом, полезным запросом будет «выбрать всех розничных продавцов, у которых в наличии есть продукт «Клубника» или какие-либо дети.
Позвольте мне проиллюстрировать это на примере кода:
class Vegetable(MPTTModel) :
name = TextField(...)
group = TreeForeignKey('self',
related_name='subgroups',
null=True, default=None)
class MPTTMeta:
parent_attr = 'group'
def getRetailers(self) :
# Here the missing code
class Retailer(Model) :
name = TextField(...)
vegetables = ManyToMany(Vegetable, null=True)
fruits = Vegetable(name='Fruit')
pears = Vegetable(name='Pear', group=fruits)
apples = Vegetable(name='Apple', group=fruits)
goldenApples = Vegetable(name='Golden Apple', group=apples)
royalApples = Vegetable(name='Royal Apple', group=apples)
for o in fruits, pears, apples, goldenApples, royalApples : o.save()
toni = Retailer(name='Toni')
pere = Retailer(name='Pere')
benet = Retailer(name='Benet')
mall = Retailer(name='CityMall')
for o in toni, pere, benet, mall : o.save()
toni.vegetables.add(pears)
pere.vegetables.add(goldenApple)
pere.vegetables.add(royalApple)
benet.vegetables.add(goldenApple)
mall.vegetables.add(apples)
# The following query set should return Pere, Benet and CityMall but not Toni.
Vegetable.get(name='Apple').getRetailers()
Итак, как мне создать такой запрос с помощью Django API?