2

我想要一个使用 django-rest-framework 的可浏览 API 来使用 mongodb 作为模型的休息服务。具体来说,我希望能够在所有文章的列表中使 url 指向实际的 GET 方法。

我有以下模型和序列化程序:

class Article(mongoengine.Document):
    article_id = mongoengine.StringField(required=True)
    author_id = mongoengine.StringField(required=True)
    content = mongoengine.StringField(required=True)

class ArticleSerializer(serializers.Serializer):
    url = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='article-detail')
    article_id = serializers.CharField(required=True)
    author_id = serializers.CharField(required=True)
    content = serializers.CharField(required=True)

    def restore_object(self, attrs, instance=None):
        if instance is not None:
            for k, v in attrs.iteritems():
                setattr(instance, k, v)
                return instance

        return Article(**attrs)

但是在运行时出现以下错误:

AttributeError:“文章”对象没有属性“url”

我尝试将 url 属性添加到模型中,但无论如何,当对象被序列化时,都不会添加正确的 url。对我的 mongo 对象文章,serializers.HyperlinkedRelatedField 的正确用途是什么?

编辑:

我想这要归功于 Climax。我改为

serializers.HyperlinkedIdentityField(view_name='article-detail', lookup_field='article_id')

但我明白了

{“url”:“/article/125/”,“article_id”:“125”}。

我如何才能拥有 DNS 名称,以便 API 真正可浏览?例如:

{“url”:“ http://example.com:1234/article/125/ ”,“article_id”:“125”}

4

1 回答 1

2

你必须使用HyperlinkedIdentityField. 同样在这种情况下,这种关系在任何方向上都不是很多,因为这个序列化程序是针对单个对象的。

url = serializers.HyperlinkedIdentityField(many=False, read_only=True, view_name='article-detail')
于 2013-10-01T06:18:40.017 回答