最近,我将一个 Django 应用程序从 Django 1.4 迁移到 Django 1.11。我遇到了一个关于 field_to_native 的问题。我非常感谢任何提示。
原代码:
class LoopgroupDqHyperlinkedIdentityField(relations.HyperlinkedIdentityField):
def field_to_native(self, obj, field_name):
# copied from superclass
request = self.context.get('request', None)
format = self.format or self.context.get('format', None)
view_name = self.view_name or self.parent.opts.view_name
# new
lgdq_attrs = 'loopgroup_id', 'year', 'month'
view_kwargs = dict((X, getattr(obj, X)) for X in lgdq_attrs)
return RF_reverse(view_name,
kwargs=view_kwargs, request=request, format=format)
class LoopgroupDqSerializer(HyperlinkedModelSerializer):
url = LoopgroupDqHyperlinkedIdentityField()
class Meta:
model = LoopgroupDq
fields = tuple(X.name for X in LoopgroupDq._meta.fields) + ('url',)
系统返回以下错误
文件“/srv/projects/python/dotfreewaydata/dataquality/serializers.py”,第 43 行,在 LoopgroupDqSerializer 中
url = LoopgroupDqHyperlinkedIdentityField()
文件“/srv/virtual_environments/dotfreewaydata/local/lib/python2.7/site-packages/rest_framework/relations.py”,第 408 行,位于 init 中
断言 view_name 不是 None,“view_name
参数是必需的。”
AssertionError:view_name
参数是必需的。
我用谷歌搜索了这个错误消息,发现 field_to_native 在 Django Rest Framework 3.0 中已被弃用。
在 http://www.django-rest-framework.org/topics/3.0-announcement/ 他们提到
1) 删除了 field_from_native() 和 field_to_native() 方法。
2)现在,如果您需要访问整个对象,则需要重写以下一项或两项:
使用 get_attribute 修改传递给 to_representation() 的属性值。 使用 get_value 修改传递给_internal_value() 的数据值。
网站给出了一些简单的例子。但是,我不明白。
谁能告诉我如何将“field_to_native”修改为“get_attribute”和“get_value”等。
最佳答案
我自己已经解决了这些问题。
是的。 'to_representation' 用于替换 'field_to_native'
class LoopgroupDqHyperlinkedIdentityField(relations.HyperlinkedIdentityField):
# def field_to_native(self, obj, field_name):
def to_representation(self, obj):
# copied from superclass
request = self.context.get('request', None)
format = self.format or self.context.get('format', None)
view_name = self.view_name or self.parent.opts.view_name
# new
lgdq_attrs = 'loopgroup_id', 'year', 'month'
view_kwargs = dict((X, getattr(obj, X)) for X in lgdq_attrs)
return RF_reverse(view_name,
kwargs=view_kwargs, request=request, format=format)
class LoopgroupDqSerializer(HyperlinkedModelSerializer):
# url = LoopgroupDqHyperlinkedIdentityField()
url = LoopgroupDqHyperlinkedIdentityField(view_name="loopgroupdq-detail")
将“field_to_native”替换为“to_representation”
HyperlinkedIdentityField 需要 view_name 因此,我提供 view_name="loopgroupdq-detail"
loopgroupdq-detail 在同一应用程序的 urls.py 中定义
url(r'^(?P\d+)/(?P\d+)/(?P\d{1,2})/$', LoopgroupDqDetail.as_view(), name='loopgroupdq-detail')
关于python - 如何在 Django/Rest FrameworkWork 中修改 field_to_native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51713938/