由于某种原因,在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字段没有域名。
答案 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。所以我想这是一个修复过的错误。