我有以下型号:
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
我的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)