问题描述
环境:
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 (将#修改为@)