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')하지만 여러 개의 중복이 발생하고 올바른 순서로 표시되지 않습니다. 어떻게 중복을 피할 수 있으며 각 영화마다 예고편 개체의 날짜별로 한 항목이 있습니까?

편집 : 난 그냥이 모든 항목을 표시하지 않는 것으로 나타났습니다하지만 단지 그들 중 일부

답변

0

가까이했지만 내가 좋아하는 것으로 오름차순 또는 내림차순에 대한 여부, 작동하지 않았다, 그러나 나는 마침내에 따라 답을 알아 낸 :

from django.db.models import Max 

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

투표의 근접 답변을 고려하십시오. – c0der

2

업데이트 : 영업 이익은 최신 트레일러 날짜별로 정렬이 원하는, 그리고 최초의 트레일러 날짜.

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() 

그들이 여러 트레일러를했을 때의 영화를 원하는 것을 위해 명확하지, 그래서 나는 그것이 최초의 트레일러를 기반으로 한 추측. 2PS 대답 @

+0

처음 제기/영화/**에서 ** NoReverseMatch의 오류와 함께 그것을 시도했을 때 :'Movie.objects.annotate (earliest_trailer = Min ('trailer__date')). order_by ('earliest_trailer')' 올바른 순서는 아니며 주문은 최신 예고편을 기반으로합니다. 두 번째 오류가 발생했습니다 : ** 'odict_values'객체는 subscriptable이 아닙니다 ** 의미가 확실하지 않습니다 – mari

+0

** 편집 : ** Movie.objects.annotate (earliest_trailer = Min ('trailer__date')) .order_by ('가장 오래된 _trailer')는 모든 객체를 표시하지만 임의의 순서로 계속 표시됩니다. – mari

+0

@mari : 스크립트 가능한 문제를 해결할 수있는 코드가 충분하지 않습니다. 위의 예가 업데이트되었습니다. 최신 예고편으로 정렬합니다. 다음 번에 원래 게시물에이를 지정하십시오. – 2ps