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

问题描述

环境

Django 2.2.16
Django RESTFramework 3.8.2

比方说,我想将我的query_set分组为一种特定的格式,并一次序列化所有模型。

过去,我们使用自定义模型对类型进行分组,然后提供给自定义序列化程序。 但是,我们最近尝试将Django从1.11.x升级到2.2,以及DRF。

然后,出现错误提示,但我无法修复。我还发现了link,看起来像是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)

有效。但是在CustomizeSerializer之后,我没有很好的方法将 group_by('type')设置为我期望的格式。

如何在Django2.2中的CustomizeSerializer中重写DictField?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)