Python 在Django DRF的组合模型序列化程序中使用DictField

Python 在Django DRF的组合模型序列化程序中使用DictField,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,环境: Django 2.2.16 Django RESTFramework 3.8.2 比方说,我希望将我的查询集分组为特定格式,并一次序列化所有模型 过去,我们使用自定义模型对类型进行分组,然后将其馈送到自定义序列化程序。 然而,我们最近尝试将Django从1.11.x升级到2.2,并将其升级为DRF 然后,出现了一个错误提示,我无法修复它。我还发现了一个,看起来这是DRF中的一个已知问题 AttributeError:“DictField”对象没有属性“partial” 我定义了几个模型

环境

Django 2.2.16
Django RESTFramework 3.8.2
比方说,我希望将我的查询集分组为特定格式,并一次序列化所有模型

过去,我们使用自定义模型对类型进行分组,然后将其馈送到自定义序列化程序。 然而,我们最近尝试将Django从1.11.x升级到2.2,并将其升级为DRF

然后,出现了一个错误提示,我无法修复它。我还发现了一个,看起来这是DRF中的一个已知问题

AttributeError:“DictField”对象没有属性“partial”

我定义了几个模型和序列化程序

class ModelA(models.Model):
    job_id = models.IntegerField()
    type = models.CharField(max_length=16)
    ... Some fields

class ModelASerializer(serializers.ModelSerializer)
    class Meta:
        model = ModelA
        field = '__all__'

class ModelB(models.Model):
    Job_id = models.IntegerField()
    type = models.CharField(max_length=16)
    ... Some fields

class ModelBSerializer(serializers.ModelSerializer)
    class Meta:
        model = ModelB
        field = '__all__'

... and many models below
我创建一个自定义模型,将所有模型序列化为特定格式

class CustomizeModel:
   def __init__(self, Job_id):
     self.a = {}
     self.b = {}

   # In below, I group the query_set by 'type'
   a_set = ModelA.objects.filter(job_id=job_id)
   for obj in a_set:
      if obj.type not in self.a: 
         self.a[obj.type] = []
      self.a[obj.type].append(obj)

   b_set = ModelB.objects.filter(job_id=job_id)
   for obj in a_set:
      if obj.type not in self.b: 
         self.b[obj.type] = []
      self.b[obj.type].append(obj)
       

class CustomizeSerializer(serializers.Serializer):
    a = serializers.DictField(child=ModelASerializer(many=True))
    b = serializers.DictField(child=ModelBSerializer(many=True))
我的看法是:

def get_model_data(request, job_id):
    ...

    model = CustomizeModel(job_id)
    serializer = CustomizeSerializer(model)

    # This serialize.data gives an error
    # AttributeError: 'DictField' object has no attribute 'partial'
    json_str = json.dumps(serializer.data)

    return HttpResponse(json_str)
该代码在Django 1.11和DRF 3.5.4中使用

我的预期结果是转储为JSON格式,如下所示

{ 
  a: {type1: [query_set_a filter by job_id and type1],
      type2: [query_set_a filter by job_id and type2]},
  b: {type1: [query_set_b filter by job_id and type1],
      type2: [query_set_b filter by job_id and type2]}, 
}
然而,我尝试了几种方法重写这个连载程序,但没有成功

class CustomizeModel:
   def __init__(self, Job_id):
     self.a = ModelA.objects.filter(job_id=job_id)
     self.b = ModelB.objects.filter(job_id=job_id)

class CustomizeSerializer(serializers.Serializer):
    a = ModelASerializer(many=True)
    b = ModelBSerializer(many=True)
成功了。但是在定制Serializer之后,我没有一个很好的方法来按('type')分组

class ModelA(models.Model):
    job_id = models.IntegerField()
    type = models.CharField(max_length=16)
    ... Some fields

class ModelASerializer(serializers.ModelSerializer)
    class Meta:
        model = ModelA
        field = '__all__'

class ModelB(models.Model):
    Job_id = models.IntegerField()
    type = models.CharField(max_length=16)
    ... Some fields

class ModelBSerializer(serializers.ModelSerializer)
    class Meta:
        model = ModelB
        field = '__all__'

... and many models below
如何在Django2.2中的CustomizeSerializer中重写DictField?