2016-07-19 5 views
0

У меня есть две модели в моем приложении Django, Project и ProjectCategory, а Project имеет это многозначное поле Категория.Python: как искать многозначное поле в списке БЕЗ дополнительных запросов?

class ProjectCategory(models.Model): 
    name = models.CharField(max_length=200) 
    ... 

class Project(models.Model): 
    category = models.ManyToManyField(ProjectCategory) 
    name = models.CharField(max_length=40) 
    ... 

Я извлечение всех объектов проекта и сохранение их в списке, называемый портфеля, и теперь я хочу, чтобы сделать списки проектов для каждой категории, но я хочу сделать это без каких-либо дополнительных запросов.

Так что я должен искать для каждой категории, если она существует в каждом проекте категории поле (это, поиск объекта в списке объектов)

portfolio = Project.objects.all().order_by('name') 
categories = ProjectCategory.objects.all() 
for category in categories: 
    portfolio.filter(category__name=category.name) 

... но я новый в Python, и я не знаю, как это сделать эффективно. Я не уверен, создаю ли я новый запрос в коде, как сейчас. Какой был бы лучший подход для этого? Благодаря!

ответ

0

Вы можете пройти в несколько поисков в .prefetch_related()

portfolio = Project.objects.all().order_by('name').prefetch_related() 
+0

Как это работает? Я понимаю, что он «сохраняет» список, но когда я вызываю .filter(), он не будет делать новый запрос к базе данных, но вместо этого будет фильтроваться на Python? –

+0

QuerySets ленивы. https://docs.djangoproject.com/en/1.9/ref/models/querysets/#when-querysets-are-evaluated – okuznetsov