python - 如何将序列化程序中的模型查询集打包到一个字段 DRF 中?
问题描述
例如我有几个模型:
class Parent(Model):
api_key = CharField(max_length=250)
class Child(Model):
parent = ForeignKey(Parent, related_name='children')
status = CharField(max_length=250)
我基于 ListAPIView 和序列化器编写了视图:
class ChildSerializer(ModelSerializer):
class Meta:
fields = ['id']
我需要通过 api_key 找到父级来带走所有的孩子,并将其返回为:
{
children:[
{'id':1},
{'id':2}
]}
但我接受这个:
[
{'id':1},
{'id':2}
]
解决方案
好吧,您可以定义一个ParentSerializer
它也将返回子对象数据:
class ParentSerializer(ModelSerializer):
child = ChildSerializer(many=True)
class Meta:
fields = ['api_key', 'child']
然后你需要找到父对象api_key
并将Parent
对象传递给 this serializer
。像这样:
class ParentView(RetrieveAPIView):
queryset = Parent.objects.all()
lookup_field = 'api_key'
serializer_class = ParentSerializer
lookup_url_kwarg = 'api_key'
最后设置url
为:
path('/parent/<str:api_key>/', ParentView.as_view(), name='parent-detail')
更新
如果您需要从request.GET
(url 查询字符串)获取数据,那么它就简单多了。试试这样:
class ParentView(ListAPIView):
queryset = Parent.objects.all()
serializer_class = ParentSerializer
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
api_key = request.GET.get('api_key')
if api_key:
return queryset.filter(api_key=api_key)
return queryset
推荐阅读
- flutter - 在 Flutter 中将 ListView 项导出到文本文件
- java - Android:如何只显示当前登录用户的数据?
- cmd - 强制 CMD 将管道更新到剪贴板
- python - Pandas 使用 groupby-apply 将索引作为列进行透视
- python - Python 语句适用于 Python2,但不适用于 Python3。我应该改变什么?
- postgresql - 如何将空记录输入到 postgres 表中
- java - 如何访问泛型类型中的泛型类型?
- ios - SwiftUI Scrollview Kingfisher KFImage Firebase 存储 IDEDebugSessionErrorDomain 代码:4 来自调试器的消息:因内存问题而终止
- c# - 为什么我的表单正文在 Web API 中始终为空?
- angular - Angular Reactive Forms:如何使表单值不进入后端