Сортировка двух разных моделей по разным именам полей - PullRequest
3 голосов
/ 21 января 2012

У меня есть две модели: PostType1, PostType1.

class PostType1(models.Model):
    ...
    created_date = models.DateTimeField(_('created date'), blank=True, null=True)

class PostType2(models.Model):
    ...
    publish_date = models.DateTimeField(_('publish date'), blank=True, null=True)

Я делаю запрос для получения:

posts_type1 = PostType1.objects.all()
posts_type2 = PostType2.objects.all()

Я знаю, как их связать:

posts = chain(posts_type1,posts_type2)

Я ищу способ отсортировать их по убыванию даты.
Это возможно ? Или мне посмотреть на сырой sql?

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Итак, если вы планируете сортировать объединение двух наборов запросов, вы должны использовать метод sorted.Я хотел бы пойти на что-то вроде:

sorted(chain(posts_type1, posts_type2), 
       key=lambda x: x.created_date if isinstance(x, PostType1) 
                                    else x.publish_date)
1 голос
/ 21 января 2012

Каждый запрос может выполнить сортировку, используя order_by:

posts_type1 = PostType1.objects.all().order_by('-created_date')
posts_type2 = PostType2.objects.all().order_by('-publish_date')

Если вы хотите, чтобы весь результат был отсортирован, вы можете использовать пользовательский итератор вместо chain.Пример только для двух моделей (хотя не обязательно самых чистых):

def chain_ordered(qs1, qs2):
    next1 = qs1.next()
    next2 = qs2.next()
    while next1 is not None or next2 is not None:
        if next1 is None: yield next2
        elif next2 is None: yeild next1
        elif next1 < next2:
            yield next1
            try:
                next1 = qs1.next()
            except StopIteration:
                next1 = None
        else:
            yield next2
            try:
                next2 = qs2.next()
            except StopIteration:
                next2 = None

Предложение StefanoP об использовании sorted также будет работать, но AFAIK будет извлекать все элементы из базы данных во время сортировки, котораяили может не беспокоить вас.

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