2016-10-01 64 views
1

我有這就是所謂的Movie類:的Django - 訂購外鍵

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')但這會導致多個重複項,並且不會以正確的順序顯示它們,我如何避免重複項,並且每個按預定義對象日期排序的每部電影都有一個條目?

編輯:我只注意到它不顯示所有項目,但只是其中的一部分

回答

0

@ 2PS回答很接近,但沒有工作,我也喜歡,無論是爲升序或降序,但我終於想通了一個答案基於他:

from django.db.models import Max 

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

考慮投票結束答案 – c0der

2

更新:在OP希望這個由最新的預告片日期排序,而不是由最早的預告片日期。

你可以在這裏使用註釋如果你想:

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 

或者你可以使用你原來的查詢和夫婦它的字典。

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('最早的_trailer')'確實顯示了所有的對象,但它仍然是一個隨機的順序 – mari

+0

@mari:你沒有足夠的代碼來幫助我們處理腳本問題,並且上面的例子已經更新按最新預告片排序。請確保在下次您的原始帖子中指定。 – 2ps