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?