【问题标题】:how to revise field_to_native in Django/Rest FrameWork如何在 Django/Rest FrameWork 中修改 field_to_native
【发布时间】:2018-08-06 18:50:50
【问题描述】:

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

系统返回如下错误 LoopgroupDqSerializer 中的文件“/srv/projects/python/dotfreewaydata/dataquality/serializers.py”,第 43 行 url = LoopgroupDqHyperlinkedIdentityField() init 中的文件“/srv/virtual_environments/dotfreewaydata/local/lib/python2.7/site-packages/rest_framework/relations.py”,第 408 行 断言 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”等等。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我自己解决了这些问题。

    是的。 '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")
    

    用“to_representation”替换“field_to_native”

    View_name 是 HyperlinkedIdentityField 所必需的 因此,我提供 view_name="loopgroupdq-detail"

    loopgroupdq-detail 定义在同一个应用的 urls.py 中

    url(r'^(?P\d+)/(?P\d+)/(?P\d{1,2})/$', LoopgroupDqDetail.as_view(), name='loopgroupdq-detail')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2014-08-24
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多