带有django-rest-framework的mongo支持模型的可浏览REST api

时间:2013-09-30 20:23:36

标签: python django mongodb mongoengine django-rest-framework

我希望使用django-rest-framework为使用mongodb的休息服务提供可浏览的API。 具体来说,我希望能够将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:'Article'对象没有属性'url'

我尝试将url属性添加到模型中,但在任何情况下,在序列化对象时都不会添加正确的url。 什么会正确使用serializers.HyperlinkedRelatedField为我的mongo对象文章?

修改

我认为这几乎要归功于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”}

1 个答案:

答案 0 :(得分:2)

您必须使用HyperlinkedIdentityField。同样在这种情况下,任何方向的关系都不多,因为此序列化器用于单个对象。

url = serializers.HyperlinkedIdentityField(many=False, read_only=True, view_name='article-detail')