相关疑难解决方法(0)

在Django REST框架中优化数据库查询

我有以下型号:

class User(models.Model):
    name = models.Charfield()
    email = models.EmailField()

class Friendship(models.Model):
    from_friend = models.ForeignKey(User)
    to_friend = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

这些模型用于以下视图和序列化程序:

class GetAllUsers(generics.ListAPIView):
    authentication_classes = (SessionAuthentication, TokenAuthentication)
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = GetAllUsersSerializer
    model = User

    def get_queryset(self):
        return User.objects.all()

class GetAllUsersSerializer(serializers.ModelSerializer):

    is_friend_already = serializers.SerializerMethodField('get_is_friend_already')

    class Meta:
        model = User
        fields = ('id', 'name', 'email', 'is_friend_already',)

    def get_is_friend_already(self, obj):
        request = self.context.get('request', None)

        if request.user != obj and Friendship.objects.filter(from_friend = user):
            return True
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

所以基本上,对于GetAllUsers视图返回的每个用户,我想打印出用户是否是请求者的朋友(实际上我应该检查from_和to_friend,但对于问题并不重要)

我看到的是,对于数据库中的N个用户,有1个查询用于获取所有N个用户,然后在序列化程序中查询1xN个查询 get_is_friend_already

有没有办法在休息框架方式中避免这种情况?也许是将select_related …

python django-orm django-queryset django-select-related django-rest-framework

19
推荐指数
2
解决办法
1万
查看次数

Django REST框架:设置嵌套序列化程序的预取

我的Django驱动的应用程序与DRF API工作正常,但我已经开始遇到性能问题,因为数据库填充了实际数据.我已经使用Django Debug Toolbar进行了一些分析,发现我的许多端点在返回数据的过程中会发出数十到数百个查询.

我期待这一点,因为我之前没有对数据库查询进行任何优化.现在我正在设置预取,但是当串行器嵌套在不同的串行器中时,我在使用正确预取的串行器数据时遇到了麻烦.我一直在使用这篇精彩的帖子作为如何考虑预取的不同方法的指南.

目前,ReadingGroup当我点击/api/readinggroups/端点时,我的序列化程序会正确预取.我的问题是/api/userbookstats/端点,它返回所有UserBookStats对象.相关的序列化程序UserBookStatsSerializer有一个嵌套的ReadingGroupSerializer.

模型,序列化程序和视图集如下:

models.py

class ReadingGroup(models.model):
    owner = models.ForeignKeyField(settings.AUTH_USER_MODEL)
    users = models.ManyToManyField(settings.AUTH_USER_MODEL)
    book_type = models.ForeignKeyField(BookType)
    ....
    <other group related fields>

   def __str__(self):
     return '%s group: %s' % (self.name, self.book_type)

class UserBookStats(models.Model):
    reading_group = models.ForeignKey(ReadingGroup)
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    alias = models.CharField()

    total_books_read = models.IntegerField(default=0)
    num_books_owned = models.IntegerField(default=0)
    fastest_read_time = models.IntegerField(default=0)
    average_read_time = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class ReadingGroupSerializer(serializers.ModelSerializer):
    users = UserSerializer(many = True,read_only=True)
    owner = …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

15
推荐指数
2
解决办法
7052
查看次数