Пользовательские свойства в запросе - PullRequest
2 голосов
/ 20 июня 2010

Учитывая приведенный ниже упрощенный пример, как мне получить доступ к своему пользовательскому свойству "current_status" в наборе запросов?Это вообще возможно?

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

class Event(models.Model):
    ....

    date_registered = models.DateField(null=True, blank=True)
    date_accepted = models.DateField(null=True, blank=True)
    date_reported = models.DateField(null=True, blank=True)
    ...

    def _get_current_status(self):
        ...
        if self.date_reported:
            return "Reported"
        if self.date_accepted:
            return "Accepted"
        if self.date_registered:
            return "Registered"
        if self.date_drafted:
            return "Drafted"

    current_status = property(_get_current_status)

Ответы [ 3 ]

2 голосов
/ 20 июня 2010

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

0 голосов
/ 20 июня 2010

Спасибо Даниилу. Я думаю, что я мог бы использовать ваш подход. Тем не менее, мне также удалось заставить его работать, используя дополнительный метод queryset, который также может быть полезен для других людей, хотя, вероятно, он не зависит от базы данных.

qs = Event.objects.extra(select={'current_status_id': 
            '''(CASE 
            WHEN date_cancelled THEN 0
            WHEN date_closed THEN 6
            WHEN date_signed_off THEN 5
            WHEN date_reported THEN 4
            WHEN date_accepted THEN 3
            WHEN date_registered THEN 2
            WHEN date_drafted THEN 1
            ELSE 99
            END)
            '''})
0 голосов
/ 20 июня 2010

Вы не можете использовать пользовательское свойство в запросе, так как ORM Django попытается сопоставить его со столбцом базы данных и потерпит неудачу.Конечно, вы можете использовать его в оцененном наборе запросов, например, когда вы итерируете объекты результатов запроса!
Вы можете фильтровать только такие вещи как: Event.objects.filter(date_drafted__isnull=False).http://docs.djangoproject.com/en/dev/ref/models/querysets/#isnull

...