模型字段名为url和django rest框架url

Dav*_*ddd 4 django django-rest-framework

几天前我开始使用伟大的django-rest-framework.我无法解决这个简单的问题.

我的模型包含一个名为url的models.URLField.

我的serializers.py文件:

class ModelSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')    

    class Meta:
        model = Model
        fields = ('url', 'owner', 'title', 'abstract', 'category', 'position', 'param1')
Run Code Online (Sandbox Code Playgroud)

检查API结果,使用model.URLField填充字段'url'.

"results": [
        {
            "url": "http://www.web.com", 
            "owner": "me", 
            "title": "title of the stuff"
        }
Run Code Online (Sandbox Code Playgroud)

相反,我想拥有

"results": [
        {
            "url": "http://localhost:8000/en/apiv1/maps/4/", 
            "url_in_model": "http://www.web.com", 
            "owner": "me", 
            "title": "Forest fire"
        }
Run Code Online (Sandbox Code Playgroud)

我怎么解决?谢谢

小智 7

它可能被认为是糟糕的形式(我绝不是专业程序员或rest_framework专家),但我相信你可以为序列化输出添加额外的上下文:

http://django-rest-framework.org/api-guide/serializers.html#specifying-fields-explicitly


class AccountSerializer(serializers.ModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)
    groups = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Account
Run Code Online (Sandbox Code Playgroud)

额外字段可以对应于模型上的任何属性或可调用.


所以在上面的字段'get_absolute_url'必须在'Account'模型中.在你的情况下(我认为)你可以这样做:

class ModelSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.Field(source='owner.username')
    url_in_model = serializer.Field(source='url')    

    class Meta:
        model = Model
        fields = ('url', 'url_in_model', 'owner', 'title', 'abstract', 'category', 'position', 'param1')
Run Code Online (Sandbox Code Playgroud)

当然你会选择适合的字段类型.

我没有机会对此进行测试,因此有可能使用"url"作为您的来源会导致问题而且您可能想要将您的模型字段命名为其他内容 - 如果是这种情况而道歉并且我浪费了您的时间.

希望我有所帮助.


Mat*_*per 5

接受的答案并没有DRF 3.我的工作我得到了我的模型的url数据都urlurl_in_model。为了url从 DRF获得正确的值,它看起来像:

class AccountSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='account-detail')
    url_in_model = serializer.URLField(source='url')  

    class Meta:
        model = Account
Run Code Online (Sandbox Code Playgroud)

account-detail 应替换为与单个帐户对应的任何视图。