Django Models和SELECT是否与两个或多个表合并?
如何使用Django模型对两个(或更多)联接表进行选择 例如: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):
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()可能是减少数据库查询的一种方法。