Вопрос

Я хотел бы узнать, как выбрать все объекты, чье поле ManyToMany содержит другой объект. У меня есть следующие модели (урезанные)

class Category(models.Model):
    pass

class Picture(models.Model):
    categories = models.ManyToManyField(Category)
    visible = models.BooleanField()

Мне нужна функция, чтобы выбрать все картинки в одной или нескольких категориях:

def pics_in_cats(cat_ids=()):
    pass

НО это должно вернуть QuerySet, если это возможно, чтобы я мог сделать что-то вроде:

pics_in_cats((1,2,3)).filter(visible=True)

Это можно сделать, загрузив все соответствующие объекты Category и объединив их атрибуты picture_set, но это кажется неэффективным. Я также хотел бы, по возможности, избежать использования необработанного SQL.

Заранее спасибо

Это было полезно?

Решение

Зачем писать пользовательскую функцию, а не использовать что-то подобное? (Непроверенные)

pics = Picture.objects.filter(categories__in = [1,2,3]).filter(visible=True)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top