gpt4 book ai didi

python - Django - 序列化程序中的源代码导致过多的数据库调用

转载 作者:太空狗 更新时间:2023-10-30 00:10:41 27 4
gpt4 key购买 nike

我正在尝试在 Django 中创建歌曲-艺术家-专辑关系。我有以下模型:

class Artist(models.Model):
gid = models.CharField(max_length=63, blank=True)
name = models.CharField(max_length=255, blank=True)
begin_life = models.CharField(max_length=31, blank=True)
end_life = models.CharField(max_length=31, blank=True)
type = models.CharField(max_length=1, blank=True)
gender = models.CharField(max_length=1, blank=True)

class Song(models.Model):
gid = models.CharField(max_length=63, blank=True)
title = models.CharField(max_length=255, blank=True)
artist = models.ForeignKey('Artist', related_name='songs_artist')
album = models.ForeignKey('Album', related_name='songs_album')
length = models.IntegerField(default=0)

我已经创建了我的 ArtistSerializer,这样我就可以在获取任何特定艺术家的信息时检索该艺术家的所有歌曲。这是我创建的序列化程序:

class ArtistSerializer(serializers.ModelSerializer):
songs_artist = SongSerializer(source='songs_artist')
class Meta:
model = Artist
fields = ('name', 'type', 'gender', 'begin_life', 'end_life', 'songs_artist')

class SongSerializer(serializers.ModelSerializer):
artist = SongArtistSerializer()
album = SongAlbumSerializer()
class Meta:
model = Song
fields = ('id', 'title', 'artist', 'album', 'length')

class SongArtistSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = ('id', 'name')

对我的艺术家的 GET 方法的快速分析揭示了一些令人不安的事实。以下是按时间和调用次数排序的分析结果:http://pastebin.com/bwcKsn2i .

但是,当我从序列化程序中删除 songs_artist 字段时,分析器的输出如下:http://pastebin.com/0s5k4w7i .

如果我没看错的话,当我使用 source 时,数据库被访问了 1240 次!

除了这样做还有其他选择吗?

提前致谢。

最佳答案

Django REST Framework 不会为您优化您的查询,由您决定如何最好地删除任何 N+1 查询。您应该遵循 the Django documentation 中涵盖的指南处理性能问题。

在 ForeignKey 关系的情况下,您应该使用 select_related在您的查询中,这将预取原始查询中的对象。

在 ManyToMany 和 GenericForeignKey 关系的情况下,您应该使用 prefetch_related .我在 another Stack Overflow answer 中写了很多关于这个的内容,但要点是您可以像 select_related 一样使用它。

您应该覆盖 View 上 get_queryset 中的查询以获得最佳结果,因为您不必担心 Django REST Framework 在用作类的属性时错误地克隆查询集。

关于python - Django - 序列化程序中的源代码导致过多的数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26784007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com