Сортировка последних добавленных в Django

#django #django-views

#django #django-просмотры

Вопрос:

Я пытаюсь показать 8 самых последних добавленных сканирований, делая это:

 def index(request):
....
recent_scans = Image.objects.filter(category='Scan').order_by('-date_added')[:8]
...
  

Это «работает», но это не означает буквального получения 8 самых последних сканирований. Порядок отличается по сравнению с порядком для def scans . Порядок не полностью отличается, просто несколько сканирований неуместны.

Что странно, так это то, что это работает в этом представлении:

 def scans(request):
    image_list = Image.objects.filter(category='Scan').order_by('-date_added')
  

Вынимаем [:8] , чтобы проверить, правильно ли он отсортирован, НЕ работает, though…so Я не знаю, что это неправильно. Я только предполагаю, что модель изображения подключена через ManyToMany…

Я также пробовал это:

 recent_scans = Image.objects.filter(category='Scan').latest('date_added')
  

Но она сопровождается этой ошибкой:

Обнаружена ошибка типа при рендеринге: объект ‘Image’ не может быть повторен

Кстати, вот моя модель:

 class Image(models.Model):
    CATEGORY_CHOICES = (
    ('Cover', 'Cover'),    
    ('Scan', 'Scan'),
    ('Other', 'Other'),
    )
    title = models.CharField(max_length=128)
    image = models.ImageField(upload_to="images/")
    category = models.CharField(max_length=10, choices=CATEGORY_CHOICES)
    contributor = models.ManyToManyField(Contributor, blank=True, null=True)
    date_added = models.DateField(auto_now_add=True)    
    def __unicode__(self):
        return self.title        
    class Meta:
        ordering = ['title']
  

Я пытался добавить ‘get_latest_by = «date_added»` в мета-класс в моих моделях, но это тоже не сработало.

Ответ №1:

latest() возвращает экземпляр, а не QuerySet , как четко указано в документации django:

последние (field_name=Нет)

Возвращает последний объект в таблице по дате, используя field_name, указанный в качестве поля даты.

Вы могли бы запустить что-то вроде

 print [i.date_added 
    for i in Image.objects.filter(category='Scan').order_by('-date_added')[:8]]
  

чтобы увидеть, какие даты на самом деле имеют «неправильные» результаты…

Комментарии:

1. Вот что я получаю: [datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23), datetime.date(2011, 5, 23)] я действительно понятия не имею, что происходит. На самом деле, я вызываю запросы Python, и он показывает разные записи каждый раз, когда я сортирую по date_added. Это потому, что date_added все одинаковые? Это также поле DateTime, а не просто поле даты.

2. Еще одна странная вещь… Я проверил свои таблицы PostgreSQL, и они отображаются там по порядку…

3. На самом деле модель, которую вы опубликовали выше, показывает DateField вместо DateTimeField

4. Ну, я не думаю, что это должно повлиять на порядок в любом случае, потому что у меня есть другая модель Datefield , и она сортируется правильно.

Ответ №2:

Я не знаю, почему он неправильно упорядочивается по, date_added хотя в моей Issue модели это так. Я только предполагаю, что база данных неправильно упорядочена по последнему элементу, если это DateField а не DateTimeField . Странно, потому что, опять же, Issue модель делает то же самое.

Итак, я просто обошел это, отсортировав по id , и это отлично работает!