Django REST框架 - 使用DynamicFieldsModelSerializer时,HyperlinkedIdentityField字段永远不会获得完全限定

时间:2013-11-26 01:34:53

标签: django django-rest-framework

由于某种原因,在DynamicFieldsModelSerializer中使用HyperlinkedIdentityField或HyperlinkedRelatedField时,结果不是完全限定的。还有其他人遇到过这个问题吗?

class AvailableHoursSerializer(DynamicFieldsModelSerializer):
    uri = serializers.HyperlinkedIdentityField(
        view_name='available-hours-detail')
    staff = serializers.HyperlinkedRelatedField(
        view_name='base-profile-detail')

    class Meta:
        model = AvailableHours
        fields = ('id', 'date', 'start_time', 'end_time', 'comments', 'active',
                  'soft_delete', 'purge', 'ctime', 'mtime', 'uri', 'staff',)
        exclude = ('purge',)
        read_only_fields = ('id', 'ctime', 'mtime',)

DynamicFieldsModelSerializer的定义与网站完全相同:http://django-rest-framework.org/api-guide/serializers#dynamically-modifying-fields

这就是我得到的:

HTTP 200 OK
Vary: Accept
Content-Type: text/html; charset=utf-8
Allow: GET, POST, HEAD, OPTIONS

[
    {
        "id": 1, 
        "uri": "/api/v1/staff-profile/available-hours/1/", 
        "staff": "/api/v1/staff-profile/base-profile/1/"
    }
]

请注意,uri和staff字段没有域名。

2 个答案:

答案 0 :(得分:0)

我认为问题出在您的DynamicFieldsModelSerializer类中。如果你按照文档中的示例进行操作,那么你的AvailableHoursSerializer类继承自继承自serializers.ModelSerialize的DynamicFieldsModelSerializer,对吧?

正如你所指出的,这就是文档所说的内容。但是如果你看一下其他的例子,你会注意到模型序列化程序继承了serializers.HyperlinkedModelSerializer以获得完全限定的URL:

class AccountSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='account_detail',
        lookup_field='account_name'
    )
    users = serializerModelSerializers.HyperlinkedRelatedField(
        view_name='user-detail',
        lookup_field='username',
        many=True,
        read_only=True
    )

    class Meta:
        model = Account
        fields = ('url', 'account_name', 'users', 'created')

所以,使用:

class DynamicFieldsModelSerializer(serializers.HyperlinkedModelSerializer): 

而不是:

class DynamicFieldsModelSerializer(serializers.ModelSerializer): 

应该让你获得完全合格的网址。

希望它有所帮助。

答案 1 :(得分:0)

我最近对更新版本的Django REST Framework进行了更新,而较新版本似乎解决了这个问题。工作版本是2.3.10,看似破碎的版本是2.3.8。所以我想这是一个修复过的错误。

相关问题