Django Models和SELECT是否与两个或多个表合并?

Django Models和SELECT是否与两个或多个表合并?,django,django-models,Django,Django Models,如何使用Django模型对两个(或更多)联接表进行选择 例如: class Album(models.Model): artist = models.ForeignKey(Musician) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField() class Song(models.Model):

如何使用Django模型对两个(或更多)联接表进行选择

例如:

class Album(models.Model):
    artist = models.ForeignKey(Musician)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

class Song(models.Model):
    album = models.ForeignKey(Album)
    name = models.CharField(max_length=100)
    num_stars = models.IntegerField()

SELECT * from album, song where (album.id = song.album_id) and (album.artist_id = X)

你可以表演,但那可能不是你想做的事情。解释您的模型是什么样子以及您想要实现什么,django ORM可能足以执行查询。

django QuerySet想要返回模型实例列表,这与从连接到单个结果表的多个表返回数据的SQL概念不太相符

要实现作为示例提供的SQL查询的效果,可以执行以下操作之一:

1) 如果要按歌曲对数据进行迭代,可以按艺术家id限制查询的歌曲,如下所示:

songs = Song.objects.filter(album__artist__id=123)
for song in songs:
    print song.name
    print song.album.name
    ... do what ever you need to do with song here ...
如果您关心性能,可以添加到queryset

# the depth argument tells django to only follow foreign key relationships
# from Song one level deep
songs = Song.objects.select_related(depth=1).filter(album__artist__id=123)

for song in songs:
    # django has now already fetched the album data, so accessing it
    # from the song instance does not cause an additional database hit
    print song.album.name
2) 如果要按相册迭代数据,可以执行以下操作:

albums = Album.objects.filter(artist__id = 123)
for album in albums:
    for song in album.song_set.all():
        print song.name
        print album.name
        ... etc ...

我不是问你数据库的内容,而是你想执行的模型(或数据库架构)和sql。这是否意味着如果我想优化,最好使用示例1和select_related()?所有其他案例都将使用不止一个select?@ju-我看不到一种简单的方法可以通过一个查询通过Album.objects预取相关歌曲,因为select_related()只以一种方式遵循外键关系。因此,是的,我认为示例1中的select_related()可能是减少数据库查询的一种方法。