2011-01-25 32 views
2

簡單的Django的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? (!我將連載到JSON,所以QuerySet是首選,但如果你有做JSON的不同,簡單的,這樣我很想聽聽吧)

這是我到目前爲止有:

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

但這不保留排序,根據PlaylistTrack.position場...

謝謝!

回答

5

如果您發現您的PlaylistTrack模式無非是許多-2-許多中間表的更多,那麼事情將變得更加明顯的(檢查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() 
2

如果您擔心的命令只是在查詢結尾添加了order_by子句。

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

要轉儲結果集簡單JSON:

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

你確定你可以simplejson.dump模型嗎?我試圖在一個複雜的模型,我得到一個「無法連載到JSON」的錯誤。也許這是因爲我在工作中在複雜的模型上嘗試它?當我回家時,我會嘗試播放我的簡單播放列表... – 0atman 2011-01-26 10:36:46

+0

我想它可以用`django.core.serializers`來序列化嗎? – 0atman 2011-01-26 10:37:49