2016-03-24 4 views
0

Я пытаюсь получить правильный запрос для моего проекта. Вот пример моей модели:фильтр на чужой и от многих до многих полей отношений

Я пытаюсь получить все основанные на значении Product.collection

Eg Brand_name: Обувь является Product.collection, я хочу, чтобы все Brand_name для collection - обувь

Я попробовал __ способ тоже. Как-то он не работает.

+0

Что такое '' Collection''? Если у вас есть модель 'Collection', которая говорит, что имеет атрибут' type' (CharField), вы можете объявить поле many-to-many как 'collections = models.ManyToManyField (Collection)', и вы можете фильтровать для всех 'shoes '(предполагается, что обувь идентифицирована' Collection.type == 'shoe''), выполняя 'shoes = collections.filter (type =' shoe ')'. Или есть 'Collection'' Brand ', и вы хотите, чтобы 'Brand.name ==' shoe'' был' True'? Ваш вопрос не совсем ясен. –

ответ

0

Вы должны попробовать что-то вроде этого:

Brand.objects.product_set.filter(collections__name="Shoes").values('brand__name') 
+0

'Brand.objects.product_set.filter' вернет QuerySet для модели' Product', но 'Product' не имеет атрибута' name' (по запросу 'values ​​('name')'). «Все» также должны быть опущены. Я думаю, что @dreamer хочет все «Brand.name» на основе некоторого атрибута «Продукт». –

+0

Вы правы, тогда мы можем просто заменить «имя» на «brand__name». –

-1

Добавить в корзину Или related_name к вашему foreign key, как показано ниже,

brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, blank=True, 
          null=True, related_name='products') 

И тогда вы можете попробовать ниже запрос и он будет возвращать вам list из все Brand.name, которое имеет product__collections_name='Shoes'.

Brand.objects.filter(products__collections__name='Shoes').values_list('name', flat=True) 
+1

Возможно, немного ошибочно, если вы выберете '' бренды'' как 'related_name', скорее это будет' 'products'', потому что это то, на что он ссылается. –

+0

@a_guest: Верно. Спасибо за исправление. :) –

0
Brand.objects.filter(
    product__collection=product.collection 
).values_list('name', flat=True).distinct() 

product является экземпляром Product.

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