#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
, и это отлично работает!