【发布时间】:2014-09-19 16:29:53
【问题描述】:
我有数据我正试图放入数据库中,它包含一个我想用来为另一个字段生成数据的字段。我完全不知道如何让我的序列化程序忽略但仍然使用 obj.owner_name 来获取用于 PUT 的 owner_id。
如果有人能指出我做错了什么,那就太好了。
<root>
<list-item>
<varmst_id>1867</varmst_id>
<varmst_type>3</varmst_type>
<varmst_name>var_date </varmst_name>
<varmst_value>20140911</varmst_value>
<varmst_desc/>
<varmst_public>Y</varmst_public>
<owner_name>Operations</owner_name>
</list-item>
</root>
这是我的序列化器 -
class VariablePUTSerializer(serializers.ModelSerializer):
owner_id = serializers.SerializerMethodField('get_owner_id')
class Meta:
model = Varmst
resource_name = 'varmst'
fields = ('varmst_id', 'varmst_type', 'varmst_name', 'varmst_value', 'varmst_desc',
'varmst_public', 'owner_id')
exclude_fields = ('owner_name',)
def transform_varmst_id(self, obj, value):
maxid = Varmst.objects.latest('varmst_id').varmst_id
if Varmst.objects.filter(varmst_name=obj.varmst_name).exists():
obj.varmst_id = Varmst.objects.filter(varmst_name=obj.varmst_name).values_list('varmst_id')[0]
return obj.varmst_id
else:
obj.varmst_id = maxid + 1
return obj.varmst_id
def get_owner_id(self, obj):
obj.owner_id = Owner.objects.filter(owner_name=obj.owner_name).values_list('owner_id')[0]
return obj.owner_id
这是我尝试使用上述数据执行 PUT 时的回溯 -
Traceback:
File "D:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Python27\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "D:\Python27\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
400. response = self.handle_exception(exc)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
397. response = handler(request, *args, **kwargs)
File "D:\Tidal\API\views.py" in put
343. return Response(serializer.data, status=status.HTTP_201_CREATED)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in data
573. self._data = [self.to_native(item) for item in obj]
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in to_native
351. value = field.field_to_native(obj, field_name)
File "D:\Python27\lib\site-packages\rest_framework\fields.py" in field_to_native
1035. value = getattr(self.parent, self.method_name)(obj)
File "D:\Tidal\API\serializers.py" in get_owner_id
163. obj.owner_id = Owner.objects.filter(owner_name=obj.owner_name).values_list('owner_id')[0]
Exception Type: AttributeError at /deploy/variable/
Exception Value: 'Varmst' object has no attribute 'owner_name'
我知道“Varmst”没有名为“owner_name”的表。仅仅因为序列化程序有它并不意味着我会使用它....
【问题讨论】:
-
你的模型
Varmst显然没有名为owner_name的成员(不是表,Varmst本身就是数据库中的表)。您只能排除模型中作为属性存在的字段。 -
并且没有元选项
exclude_fields。它被称为exclude。
标签: python django serialization django-rest-framework