python - 在 django rest 框架中过滤嵌套序列化器的查询集
问题描述
这是我的看法:
class SectorListAPI(generics.ListAPIView):
queryset = SectorModel.objects.all()
serializer_class = SectorSerializer
这是我的序列化程序:
class OrganizationSerializer(serializers.ModelSerializer):
class Meta:
model = GroupProfile
fields = ('title','slug',)
class DepartmentSerializer(serializers.ModelSerializer):
organizations = OrganizationSerializer(many=True, read_only=True)
class Meta:
model = DepartmentModel
fields = ('title', 'organizations',)
class SectorSerializer(serializers.ModelSerializer):
# title = serializers.CharField()
departments = DepartmentSerializer(many=True, read_only=True)
class Meta:
model = SectorModel
fields = ('title','departments',)
看,这里的“SectorSerializer”是父“ DepartmentSerializer ”是孩子,“ OrganizationSerializer ”是孙子序列化器。现在在我看来,我可以轻松地为“ SectorModel ”过滤我的查询集。但是我如何过滤“ GroupProfile ”模型。
解决方案
您可能希望过滤查询集以确保仅返回与发出请求的当前经过身份验证的用户相关的结果。
您可以通过基于值的过滤来做到这一点request.user.
例如:
from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics
class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return Purchase.objects.filter(purchaser=user)
编辑
您可以继承 ListSerializer并覆盖该to_representation
方法。
默认情况下,该to_representation
方法调用data.all()
嵌套查询集。因此,您实际上需要data = data.filter(**your_filters)
在调用该方法之前进行。然后,您需要将您的子类 ListSerializer 添加为嵌套序列化程序元上的 list_serializer_class。
1-子类ListSerializer
,覆盖to_representation
然后调用super
2-在嵌套的序列化器上添加子类ListSerializer
作为元。list_serializer_class
与您相关的代码:
class FilteredListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(user=self.request.user, edition__hide=False)
return super(FilteredListSerializer, self).to_representation(data)
class OrganizationSerializer(serializers.ModelSerializer):
class Meta:
list_serializer_class = FilteredListSerializer
model = GroupProfile
fields = ('title','slug',)
class DepartmentSerializer(serializers.ModelSerializer):
organizations = OrganizationSerializer(many=True, read_only=True)
class Meta:
model = DepartmentModel
fields = ('title', 'organizations',)
class SectorSerializer(serializers.ModelSerializer):
# title = serializers.CharField()
departments = DepartmentSerializer(many=True, read_only=True)
class Meta:
model = SectorModel
fields = ('title','departments',)
推荐阅读
- machine-learning - 当你在不同的类中有不同数量的数据时该怎么办?
- python - 模型更改时 Django-channels 发送消息
- ios - Flutter iOS App 在 Xcode 中崩溃,添加 FirebaseApp.configure() 以实现 Firebase 集成
- reactjs - React-native 使用灯箱弹出图像
- python - 如何循环数据框列以迭代地对数据框进行排序
- c# - Unity,如何仅更改 GameObject 矩形变换的“顶部”
- regex - 正则表达式捕获 CSV 文件中的单元格
- firebase - Flutter:Firebase Auth 无限循环
- php - 如何使用 eloquent 在内部选择带有左连接的子查询?
- python - 使用 JSON 获取对象的所有值