Джанго: Как получить доступ к списку обратных отношений в представлении? - PullRequest
1 голос
/ 19 марта 2012

предположим, у меня есть модель с именем Chicken:

class Chicken(models.Model):
    name = models.CharField(max_length=30)

, и у меня также есть модель с именем Egg, которая имеет ForeignKey для модели Chicken:

class Egg(models.Model):
    chicken = models.ForeignKey(Chicken)
    layed_on = models.DateField(auto_add_now=True)

СейчасЯ хочу создать представление, содержащее список всех цыплят и дату, когда они откладывали свое последнее яйцо.

Я знаю, как положить все яйца в курицу, используя что-то вроде этого:

c = Chicken.objects.get(name='Henry')
e = c.egg_set.all()

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

{% for chicken in chickens %}
    <p>{{ chicken.name }} layed is last egg on {{ chicken.last_egg }}</p>
{% endfor %}

Это, вероятно, очень простой вопрос, но я только начинающий, и я был бы очень признателен за любую помощь, которую вы можете оказать.Документация по Django не очень помогает в этом случае.

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Что вам нужно, так это аннотация django feature . По сути, вы хотите аннотировать каждую строку в курице с помощью поля Max в яйце layed_on. Без подсказки прямо передо мной, я не могу гарантировать точное утверждение ниже, но оно должно дать вам отправную точку.

Отредактируйте свою модель цыпленка следующим образом:

class Egg(models.Model):
    chicken = models.ForeignKey(Chicken, related_name='eggs')
    layed_on = models.DateField(auto_add_now=True)

from django.db.models import Max
Chicken.objects.annotate(last_egg=Max('eggs__layed_on'))
0 голосов
/ 28 марта 2012

Мне лично нравится решать такую ​​проблему, аннотируя методы в моих моделях с помощью аннотации @property.

Пример: в вашей модели Chicken у вас будет такой метод:

@property
def last_egg(self):
    return self.egg_set.order_by('-layed_on')[0]

И в своем шаблоне вы можете использовать его как обычное поле модели.

{{my_chicken.last_egg}}

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...