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

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

Вот в основном, на что похожи наши модели

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')

и намного больше без удачи.

Любые подсказки или подсказки очень ценились бы.

Спасибо.

9
задан mhost 1 February 2010 в 08:09
поделиться

2 ответа

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

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

from django.db.models import Max
Customer.objects.annotate(latest_order=Max('order__purchase_date')).order_by('latest_order')
14
ответ дан 4 December 2019 в 14:28
поделиться

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

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

sorted(Customer.objects.all(), key=get_last_order_date)
0
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: