2013-09-07 2 views
0
class Ingredient(models.Model): 
    .. 
    status = models.CharField(max_length=16, default="pending") 

class Food(models.Model): 
    .. 
    ingredients = models.ManyToManyField(Ingredient) 


{% for i in food %} 
    {% for j in food.ingredients.all %} 

В теге for loop я хотел бы перечислить каждую пищу с ее ингредиентами, статус которых не находится в ожидании.Как я могу запросить объект и связанный с ним объект за один раз в Django

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

Благодарим за помощь.

+0

разбор шаблонов не происходит на стороне клиента! ваши теги шаблонов будут проанализированы на стороне сервера, и только сгенерированный html будет отправлен клиенту. –

ответ

1

Прежде всего и с точки зрения дизайна db, лучше, если ваше поле статуса - это список вариантов. Было бы что-то вроде этого:

class Ingredient(models.Model): 
    NEW = 1 
    PENDING = 2 
    APPROVED = 3 
    STATUS_CHOICES = (
     (NEW, 'New'), 
     (PENDING, 'Pending'), 
     (APPROVED , 'Approved'), 
    ) 
    status = models.IntegerField(default=PENDING, choices=STATUS_CHOICES) 

Теперь, так как отношение многие ко многим и получить список связанных компонентов, получить список продуктов питания, а затем применить фильтр (с учетом использования ORM фильтра по каждому пункту пищи !, или в шаблоне с помощью =)

food = Food.objects.all() 

и в шаблоне (обратите внимание на разницу во второй линии от вашего цикла):

{% for i in food %} 
    {% for j in i.ingredients.all %} 
     {% if j.status != 2 %} 

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

food = Food.objects.prefetch_related('ingredients') 

который принесет все соответствующие компоненты в одном запросе для всех продуктов питания. Проблема с prefetch_related заключается в том, что вы также должны сами делать фильтрацию.

+0

А, я видел ошибку, которую я сделал во второй строке. prefetch_related() очень полезен. –