django - Django rest框架序列化过滤的外键
问题描述
模型.py
class ModelA(models.Model):
views = models.PositiveBigIntegerField()
class ModelB(models.Model):
parent = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_name='modelB', blank=True, null=True)
string = models.CharField()
视图.py
class ModelAListView(generics.ListAPIView):
serializer_class = ModelASerialezer
queryset = ModelA.objects.all().prefetch_related('modelb')
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset.filter(modelb__string__icontains=request.GET['string']), many=True)
return Response(serializer.data)
序列化程序.py
class ModelASerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
modelB = ModelBSerializer(source='modelB', many=True, read_only=False)
class Meta:
model = ModelA
exclude = ('views',)
class ModelBSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = ModelB
fields = '__all__'
如果我需要按“字符串”字段搜索,我可以写
modelA.objects.filter(modelB__string__icontains=request.GET['string']).values('modelB__string')
仅返回具有必要string
值的ModelB 实例:
<QuerySet [{'modelB__string': 'Test1'}]>
当我按 modelb_string 过滤时,我希望只获得过滤后的 FK 值:
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
}
]
}
但我得到所有 FK 值:
{
"id": 1,
"views": 0,
"modelb": [
{
"id": 46,
"string": "Test1",
"item": 1
},
{
"id": 47,
"string": "Test85",
"item": 1
},
{
"id": 48,
"string": "Test64",
"item": 1
}
]
}
解决方案
有几点值得一提:
像这样的东西:
class ModelAListView(generics.ListAPIView):
serializer_class = ModelASerialezer
def get_queryset(self, *args, **kwargs):
queryset = modelA.objects.all()
given_string = self.request.query_params.get('string', None)
if given_string is not None:
queryset = queryset.filter(modelB__string__icontains=given_string)
return queryset
- 也许您应该考虑重命名该字段
string
参考 :
推荐阅读
- javascript - 如何提取角度 5 中的特定字符串?
- java - CloudFoundry .cignore 文件以排除两个 JAR 文件之一
- react-native - 如何在本机反应中获取Chield视图的大小?
- php - Google API PHP 库 files.get 并行
- android - 在模式的开头或结尾匹配一个单词
- amazon-web-services - 对 AWS lambda 函数执行限制感到困惑
- php - 如何为数组内的值创建常量并在php中的类外部访问它们
- c# - 使用 Microsoft Graph 获取电子邮件,无需任何用户交互
- javascript - 如何在标签更改时显示不同的 JointJS 块
- html - 下拉切换单击仅在中心工作