Django order_by связанный _set - PullRequest
       6

Django order_by связанный _set

8 голосов
/ 01 февраля 2010

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

Вот как выглядят наши модели

class Customer(models.Model):
    username = models.CharField(max_length=32)
    first_name = models.CharField(max_length=322)
    def __unicode__(self):
        return "%s" % self.username
    def get_last_order_date(self):
        self.order_set.latest('purchase_date')

class Order(models.Model):
    customer = models.ForeignKey(Customer)
    purchase_date = models.DateTimeField()

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

.order_by('order__purchase_date')
.order_by('order__set').latest('purchase_date')

и многое другое без удачи.

Любые намеки или подсказки будут очень признательны.

Спасибо.

Ответы [ 2 ]

14 голосов
/ 01 февраля 2010

Вы не можете использовать order by с функцией, как это делается на уровне базы данных.Вы можете вручную отсортировать набор запросов, используя. sort(key=get_last_order_date), но это не очень эффективно.

Лучшим способом было бы использовать функцию агрегирования Django, чтобы получить максимальную дату покупки для клиента и отсортироватьчто:

from django.db.models import Max
Customer.objects.annotate(latest_order=Max('order__purchase_date')).order_by('latest_order')
0 голосов
/ 01 февраля 2010

Вы определенно не можете заказать с помощью пользовательского метода (потому что ваша база данных не знает об этом).

Теперь, кажется, трудно делать то, что вы хотите на уровне модели, поэтому, возможно, переместите его в представление и порядок, используя python, например:

sorted(Customer.objects.all(), key=get_last_order_date)
...