2016-10-01 2 views
1

У меня есть класс, который называется фильм:Джанго - Заказ внешнего ключа

class Movie(models.Model): 
    title = models.CharField(max_length=511) 
    tmdb_id = models.IntegerField(null=True, blank=True, unique=True) 
    release = models.DateField(null=True, blank=True) 
    poster = models.TextField(max_length=500, null=True) 
    backdrop = models.TextField(max_length=500, null=True, blank=True) 
    popularity = models.TextField(null=True, blank=True) 

и класс с именем Трейлер:

class Trailer(models.Model): 
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE) 
    link = models.CharField(max_length=100) 
    date = models.DateTimeField(auto_now_add=True) 

Как можно отобразить все фильмы упорядоченные по дате из прицеп?

Я пробовал: Movie.objects.order_by('trailer__date'), но вызывает несколько дубликатов и не отображает их в правильном порядке, как я могу избежать дубликатов и иметь одну запись для каждого фильма, заказанного по дате объекта трейлера?

Edit: Я просто заметил, что он не отображает все записи, но только некоторые из них

ответ

0

@ 2PS ответ был близок, но не работает, как хотелось бы, было ли это по возрастанию или по убыванию, но я, наконец, понял, ответ на основе его:

from django.db.models import Max 

qs = Movie.objects.annotate(Max("trailer__date")).order_by('-trailer__date__max') 
+0

Рассмотреть вопрос о правильном голосовании – c0der

2

Update: ОП хотел это отсортировано по последней дате трейлера, а не самой ранней датой трейлера.

Вы можете использовать Аннотировать здесь, если вы хотите:

from django.db.models import Min 
qs = Movie.objects.values('title').annotate(latest_trailer=Max('trailer__date')).order_by('-latest_trailer') 
# Add other columns you want into the `values` if you need them 

Или вы можете использовать свой исходный запрос и пару его с Dict.

from collections import OrderedDict 
qs = Movie.objects.order_by('-trailer__date') 
movies = OrderedDict() 
for x in qs: 
    if x.id not in movies: 
     movies[x.id] = x 
movies = movies.values() 

Было неясно, в каком порядке вы хотели фильмов, когда они имели несколько трейлеров, поэтому я предположил, что это было основано на самых ранних трейлере.

+0

первый поднимает ошибка ** NoReverseMatch в/movies/**, и когда я попробовал это с помощью: 'Movie.objects.annotate (earliest_trailer = Min ('trailer__date')). order_by ('earliest_trailer')' он показывал фильмы без дубликатов, но не в правильном порядке, и порядок основан на последнем трейлере. Второй вызвал ошибку: ** Объект «odict_values» не подлежит расшифровке ** Я не уверен, что это значит – mari

+0

** Редактировать: ** 'Movie.objects.annotate (earliest_trailer = Min ('trailer__date')) .order_by ('earlyliest_trailer') 'показывает все объекты, однако он все еще находится в произвольном порядке. – mari

+0

@mari: у вас не хватает кода для нас, чтобы помочь с возможностью сценариев, и приведенный выше пример был обновлен сортировать по последнему трейлеру. Обязательно укажите это в своем исходном сообщении в следующий раз. – 2ps

Смежные вопросы