python - 如何在 Django/Rest FrameworkWork 中修改 field_to_native

标签 python django django-rest-framework

最近,我将一个 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/

相关文章:

python - Django GET 请求参数来自 POST 请求

jquery - 未捕获的类型错误 : Illegal invocation

python - 在使用此多对多关系之前,"<Story: title>"需要为字段 "id"提供一个值

python - 我可以导出RapidMiner模型以与python集成吗?

Python socketserver不同的任务

python - Pandas:当组中的值落在某个范围内时,将组保留在数据中

python - Django 中的可重用模态成员

python - 在 python 中将 CSV 转换为 JSON 文件

python - django-rest-framework + swagger ui : ImportError: No module named rest_framework_swagger

react-native - react native /博览会 : fetch throws "Network request failed" error on 401 response with formData content type