首页 > 解决方案 > 如何将序列化程序中的模型查询集打包到一个字段 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}
]

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


好吧,您可以定义一个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

推荐阅读