Rob*_*ell 6 django foreign-keys sql-order-by django-select-related
我有一个简单的音乐模式:艺术家,发行,曲目和歌曲.前3个是所有逻辑结构,而第四个(Song)是(Artist,Release,Track)的特定实例,如mp3,wav,ogg等等.
我在数据库中生成有序的歌曲列表时遇到问题.美中不足的是,双方Track
并Release
有一个Artist
.虽然Song.Track.Artist
总是表演者的名字,但Song.Track.Release.Artist
可能是表演者的名字,也可能是"各种艺术家"的编辑.我希望能够按其中一种排序,我无法弄清楚这项工作的正确方法.
这是我的架构:
class Artist(models.Model):
name = models.CharField(max_length=512)
class Release(models.Model):
name = models.CharField(max_length=512)
artist = models.ForeignKey(Artist)
class Track(models.Model):
name = models.CharField(max_length=512)
track_number = models.IntegerField('Position of the track on its release')
length = models.IntegerField('Length of the song in seconds')
artist = models.ForeignKey(Artist)
release = models.ForeignKey(Release)
class Song(models.Model):
bitrate = models.IntegerField('Bitrate of the song in kbps')
location = models.CharField('Permanent storage location of the file', max_length=1024)
owner = models.ForeignKey(User)
track = models.ForeignKey(Track)
Run Code Online (Sandbox Code Playgroud)
我的查询应该相当简单; 筛选由特定用户所拥有的所有歌曲,然后要么对其进行排序Song.Track.Artist.name
或Song.Track.Release.Artist.name
.这是我在视图中的代码,它按Song.Track.Artist.name
以下方式排序:
songs = Song.objects.filter(owner=request.user).select_related('track__artist', 'track__release', 'track__release__artist').order_by('player_artist.name')
Run Code Online (Sandbox Code Playgroud)
order_by
除非我使用,否则我无法上班tblname.colname
.我查看了底层查询对象的as_sql
方法,该方法指示当进行内部连接时获取Song.Track.Release.Artist
临时名称T6
用于Artist
表,因为已在此同一个表上完成内连接以获取Song.Track.Artist
:
>>> songs = Song.objects.filter(owner=request.user).select_related('track__artist', 'track__release', 'track__release__artist').order_by('T6.name')
>>> print songs.query.as_sql()
('SELECT "player_song"."id", "player_song"."bitrate", "player_song"."location",
"player_song"."owner_id", "player_song"."track_id", "player_track"."id",
"player_track"."name", "player_track"."track_number", "player_track"."length",
"player_track"."artist_id", "player_track"."release_id", "player_artist"."id",
"player_artist"."name", "player_release"."id", "player_release"."name",
"player_release"."artist_id", T6."id", T6."name" FROM "player_song" INNER JOIN
"player_track" ON ("player_song"."track_id" = "player_track"."id") INNER JOIN
"player_artist" ON ("player_track"."artist_id" = "player_artist"."id") INNER JOIN
"player_release" ON ("player_track"."release_id" = "player_release"."id") INNER JOIN
"player_artist" T6 ON ("player_release"."artist_id" = T6."id") WHERE
"player_song"."owner_id" = %s ORDER BY T6.name ASC', (1,))
Run Code Online (Sandbox Code Playgroud)
当我把它作为表名时order_by
它确实有用(参见上面的示例输出),但这似乎完全不可移植.当然有更好的方法来做到这一点!我错过了什么?
Dan*_*man 26
我担心我真的无法理解你的问题是什么.
一些更正:select_related
与排序无关(它根本不会更改查询集,只需跟随连接以获取相关对象并缓存它们); 并且通过相关模型中的字段进行排序,您使用双下划线表示法,而不是点缀.例如:
Song.objects.filter(owner=request.user).order_by('track__artist__name')
Run Code Online (Sandbox Code Playgroud)
但在您的示例中,您使用的是"player_artist",它似乎不是模型中任何位置的字段.我不明白你对可移植性的提及.
归档时间: |
|
查看次数: |
15284 次 |
最近记录: |