2011-01-25 5 views
2
간단한 장고 ORM 질문

: 나는 재생 목록 및 추적 모델의 아주 전형적인 예있어가장 좋은 방법

:

class Track(models.Model): 
    name = models.CharField(max_length = 50) 
    mp3 = models.FileField(upload_to="track/") 

class Playlist(models.Model): 
    name = models.CharField(max_length = 50) 

class PlaylistTrack(models.Model): 
    playlist = models.ForeignKey('track.Playlist') 
    track = models.ForeignKey('track.Track') 
    position = models.IntegerField() #Here's the crux of the problem 

이 가장 좋은 방법입니다 주문 가능한 재생 목록을 만드시겠습니까?

내가 의심 스럽지만, 그렇다면 주문 방법은 무엇입니까 QuerySet? (! QuerySet가 선호되고, 그래서 내가 JSON에 serialising 될 것입니다,하지만 당신은 JSON을 다른, 간단한, 방법이 있다면 그것을 듣고 싶어요)

다음

는 지금까지이 작업은 다음과 같습니다

playlist = Track.objects.filter(playlisttrack__playlist__exact=1) 

하지만이 PlaylistTrack.position 분야에 따라 순서를 보존하지 않습니다 ...

감사합니다!

답변

5

를, 다음 일들이 더 될 것입니다 명백한 (this 확인) :

이제
class Playlist(models.Model): 
    name = models.CharField(max_length = 50) 
    tracks = models.ManyToManyField('Track', through='PlaylistTrack') 

class PlaylistTrack(models.Model): 
    playlist = models.ForeignKey('track.Playlist') 
    track = models.ForeignKey('track.Track') 
    position = models.IntegerField() #Here's the crux of the problem 

    class Meta: 
     ordering = ['position'] 

당신은 다만 할 수 있습니다

my_playlist.tracks.all() 
+0

+1. 데이터 소스의 깨끗한 결과물로 항상 쉽게 시작할 수 있습니다! – HurnsMobile

+0

데이터를 완전히 제어 할 수 있으므로이 약간의 변경을 데이터에 적용 할 것입니다 - 감사합니다! – 0atman

2

걱정되는 순서 인 경우 쿼리 끝에 order_by 절을 추가하십시오.

playlist = Track.objects.filter(playlisttrack__playlist__exact=1).order_by('+playlisttrack__position') 

단순히 JSON으로 결과 세트를 덤프하기 : 당신이 당신의 PlaylistTrack 모델은 많은-2-많은 중간 테이블보다 더 아무것도 없다는 것을 발견하면

json_serializer = serializers.get_serializer("json")() 
json_serializer.serialize(playlist, ensure_ascii=False, stream=response) 
+0

모델을 simplejson.dump 할 수 있습니까? 나는 복잡한 모델에서이를 시도하고 있는데 "JSON에 직렬화 할 수 없다"라는 오류가 발생합니다. 어쩌면 내가 복잡한 모델을 사용하려고 노력하고 있기 때문일까요? 나는 집에 도착했을 때 간단한 재생 목록을 만들려고 노력할 것이다. – 0atman

+0

'django.core.serializers'로 직렬화 할 수있을 것이라고 상상할 수 있습니까? – 0atman

+0

네가'simplejson'으로 직접 할 수없는 것처럼 보입니다. 내 대답을 업데이트했습니다. – HurnsMobile