python - Django Rest Framework-有效地检索反向外键上的相关字段
问题描述
我有以下代表用户工作组的模型。每个工作组都有一名领导和成员:
class WorkingGroup(models.Model):
group_name = models.CharField(max_length=255)
leader = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
class WorkingGroupMember(models.Model):
group = models.ForeignKey(WorkingGroup, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
在 DRF 中,我想有效地检索所有组(有数百个)作为以下 json 对象的数组:
{
'id': <the_group_id>
'group_name': <the_group_name>
'leader': <id_of_leader>
'members': [<id_of_member_1>, <id_of_member_2>, ...]
}
为此,我设置了以下序列化程序:
class WorkingGroupSerializer(serializers.ModelSerializer):
members = serializers.SerializerMethodField()
class Meta:
model = WorkingGroup
fields = ('id', 'group_name', 'leader', 'members',)
def get_members(self, obj):
return obj.workinggroupmember_set.all().values_list('user_id', flat=True)
所以在我看来,我可以做类似的事情:
groups = WorkingGroup.objects.all().prefetch_related('workinggroupmember_set')
group_serializer = WorkingGroupSerializer(groups, many=True)
这有效,并给出了所需的结果,但是我发现它根本不能很好地扩展,因为方法workinggroupmember_set
内部似乎没有使用预取get_members
(Silky 显示了一个查询来抓取所有WorkingGroup
对象,然后是一个查询对于方法中的每个workinggroupmember_set
调用get_members
)。有没有办法在序列化程序中设置members
字段以获取扁平/单字段版本workinggroupmember_set
而不使用SerializerMethodField
? 或者其他一些让我正确使用预取的方法?
解决方案
您正在做的问题在这里使values_list
您all
的prefetch_related
. 目前无法通过values_list
查看https://code.djangoproject.com/ticket/26565进行预取。您可以做的是将其转换为 python 代码而不是 SQL
class WorkingGroupSerializer(serializers.ModelSerializer):
members = serializers.SerializerMethodField()
class Meta:
model = WorkingGroup
fields = ('id', 'group_name', 'leader', 'members',)
def get_members(self, obj):
return [wgm.user_id for wgm in obj.workinggroupmember_set.all()]
推荐阅读
- php - 回退后 WebView 引用 (HTTP_REFERER) 标头不起作用
- amazon-web-services - 如何并行运行 AWS GLUE 作业?
- python - 为什么我在这个列表理解问题中得到 UnboundLocalError?
- wix - 在捆绑链执行结束时运行 PowerShell 脚本
- service - symfony 5 服务问题 => 不在对象上下文中使用 $this
- python - Python - 国旗和肤色表情符号无法正确显示
- android - 无法在颤振中创建应用程序目录
- java - 使用 Java 使用 selenium 在电子应用程序上切换句柄
- magento2 - Magento 2.4.1 将 vat_id 添加到新订单确认模板
- react-native - 如何在 react-native 中映射来自 redux 的数据