Как включить в запрос последнюю запись из дочерней модели - PullRequest
0 голосов
/ 30 марта 2011

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

Я бы создал внешний ключ в Traderмодель, которая записывает этот идентификатор самой последней оценки, однако это невозможно, потому что тогда модели будут ссылаться друг на друга, и тогда вы создаете проблему кругового упорядочения при создании классов, т. е. трейдер ссылается на оценку, но оценка не имеетПока еще не объявлено или не ставится на оценку, но Trader еще не объявлен.

До сих пор я предполагал, что буду использовать Trader в качестве базового запроса и просматриваю оценки.Я думал, что альтернативой, чтобы обойти эту проблему, было бы создание запроса на основе оценки, а затем поиск трейдеров.Однако это означает, что те трейдеры, которые еще не были оценены, никогда не появятся в результатах (если я не убедился, что у трейдеров всегда есть хотя бы одна запись оценки).Или, я полагаю, я мог бы прибегнуть к использованию необработанного SQL.

Будем весьма благодарны за любые предложения о том, как решить эту проблему.

Вот модели:

Class Trader(models.Model):
    territory = models.ForeignKey(Territory)
    organisation_name = models.CharField(max_length=30)
    contact_title = models.CharField(choices=TITLE_CHOICES, max_length=4)
    contact_forename = models.CharField(max_length=30, blank=True)
    contact_lastname = models.CharField(max_length=30)
    ...

    def _get_current_evaluation(self):
        return Evaluation.objects.filter(trader=self).latest('open_date')

    current_evaluation = property(_get_current_evaluation)

Class Evaluation(models.Model):
    trader = models.ForeignKey(Trader)
    open_date = models.DateField("Open Date", null=True, blank=True)
    rated_date = models.DateField("Rated Date", null=True, blank=True)
    closed_date = models.DateField("Closed Date", null=True, blank=True)
    status = models.ForeignKey(RatingStatus, null=True, blank=True)
    ...

1 Ответ

0 голосов
/ 30 марта 2011

http://docs.djangoproject.com/en/dev/ref/models/querysets/#latest
http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

"Я хочу перечислить всех трейдеров вместе с текущим статусом оценки. "

traders = Trader.objects.all()

{% for trader in traders %}
    {{ trader }} : {{ trader.evaluation_set.latest.status|default:"Not Evaluated" }}
{% endfor %}

"Однако я хочу иметь возможность фильтровать результаты о состоянии последняя оценка (например, все те текущие оценки, которые все еще открыт). "

«Я думал, что есть альтернатива, чтобы обойти проблема заключается в создании запроса на основе оценки, а затем поиска Трейдеры вместо. Однако это означает что те трейдеры, которые не были оценивается еще, никогда не появится в результаты (если я не убедился, что У трейдеров всегда есть хотя бы один Оценочная запись). "

Если бы вам пришлось фильтровать по параметруvaluation_status = open, вы бы не получили трейдеров, которые еще не были оценены.

так:

status = RatingStatus.get(status='open')
traders_with_open_evals = Traders.objects.filter(evaluation__status=status).distinct()

Это не обязательно, но для справки:

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

http://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

Если вам нужно создать отношения на модели, которая еще не была определено, вы можете использовать имя модель, а не объект модели сам:

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')
    # ...

class Manufacturer(models.Model):
    # ...

Для обозначения моделей, определенных в другом приложение, вы можете явно указать модель с полным ярлык приложения. Например, если Модель производителя выше определена в другое приложение под названием производство, вам нужно использовать:

class Car(models.Model):
    manufacturer = models.ForeignKey('production.Manufacturer')

Этот тип справки может быть полезен при разрешении кругового импорта зависимости между двумя приложениями.

...