2015-09-16 3 views
0

У меня есть модель, которая имеет список тегов.Django - Жадный и запрос на ManyToMany

class Document(models.Model): 
    docfile = models.FileField(upload_to='documents/%Y/%m/%d', max_length=150) 
    tags = models.ManyToManyField(Tag) 

Я хочу, чтобы быть в состоянии найти все документы, которые помечены X и Y, но не только X и Y. То есть, я хочу документы, которые помечены X, Y, Z, чтобы показать когда я ищу X и Y.

Принимаемый ответ от вопроса this вызывает меня довольно далеко, но он возвращает элементы, помеченные тегами и тегами. Аннотации ограничивают набор запросов.

ответ

0

Вы просто хотите, чтобы INNER JOIN - это значение по умолчанию при фильтрации отношений.

Это должно делать то, что вы хотите:

Document.objects.filter(tags=X, tags=Y) 

Это заставляет вас каждый Document который имеет как тег X и Y тег, независимо от каких-либо других тегов.

+0

Это не сработает, потому что аргумент ключевого слова повторяется. – ghiotion

1

Выяснил это. На SO here есть большой ресурс. В моем конкретном случае мне нужны скошенные фильтры. Так я сделал это с произвольным количеством тегов.

docs = Document.objects 

for tag in tags: 
    docs = docs.filter(tags=tag) 

Это дало мне запрос AND, в котором я нуждался.

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