在Django Rest Framework中,如何在串行器嵌套在另一个串行器中时对其进行过滤?
我的过滤器强加在DRF视图集中,但是当您从另一个序列化程序中调用序列化程序时,嵌套序列化程序的视图集永远不会被调用,因此嵌套结果显示为未过滤.
我尝试在原始视图集上添加过滤器,但它似乎不会过滤嵌套结果,因为嵌套结果会被调用为单独的预先查询.(你看,嵌套的序列化器是反向查找.)
是否可以在嵌套的序列化程序本身中添加get_queryset()覆盖(将其移出视图集),以在那里添加过滤器?我也尝试过,没有运气.
这是我尝试过的,但它似乎甚至没有被调用:
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta:
model = Questionnaire
def get_queryset(self):
query = super(QuestionnaireSerializer, self).get_queryset(instance)
if not self.request.user.is_staff:
query = query.filter(user=self.request.user, edition__hide=False)
return query
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有以下模型:
class Zone(models.Model):
name = models.SlugField()
class ZonePermission(models.Model):
zone = models.ForeignKey('Zone')
user = models.ForeignKey(User)
is_administrator = models.BooleanField()
is_active = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)
我正在使用Django REST框架来创建一个返回区域详细信息的资源,以及一个显示该区域的经过身份验证的用户权限的嵌套资源.输出应该是这样的:
{
"name": "test",
"current_user_zone_permission": {
"is_administrator": true,
"is_active": true
}
}
Run Code Online (Sandbox Code Playgroud)
我已经创建了这样的序列化器:
class ZonePermissionSerializer(serializers.ModelSerializer):
class Meta:
model = ZonePermission
fields = ('is_administrator', 'is_active')
class ZoneSerializer(serializers.HyperlinkedModelSerializer):
current_user_zone_permission = ZonePermissionSerializer(source='zonepermission_set')
class Meta:
model = Zone
fields = ('name', 'current_user_zone_permission')
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,当我请求特定区域时,嵌套资源会为具有该区域权限的所有用户返回ZonePermission记录.有没有办法对request.user嵌套资源应用过滤器?
顺便说一下,我不想使用HyperlinkedIdentityField这个(最小化http请求).
这是我根据下面的答案实现的解决方案.我将以下代码添加到我的序列化程序类:
current_user_zone_permission = serializers.SerializerMethodField('get_user_zone_permission')
def get_user_zone_permission(self, obj):
user = self.context['request'].user
zone_permission = …Run Code Online (Sandbox Code Playgroud)