2013-09-30 292 views
2

我想要一個可瀏覽的API使用django-rest-framework爲模型使用mongodb的休息服務。 具體而言,我希望能夠將URL指向所有文章列表中的實際GET方法。Django支持的mongo支持模式的可瀏覽的REST api

我有以下的型號和序列化:在運行時,我得到了以下錯誤

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' object has no attribute 'url'

我嘗試添加url屬性的模型,但在任​​何情況下,適當的對象序列化時不會添加url。 什麼將適當使用serializers.HyperlinkedRelatedField爲我的mongo對象文章?

編輯:

我認爲這幾乎是它歸功於高潮。我改

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"}

+0

不是你的問題的答案,而是看看http://python-eve.org- monogodb的REST API。代碼是在https://github.com/nicolaiarocci/eve –

+0

嗨,亞當,謝謝,偉大的鏈接,沒有前夜翻閱。不過,我試圖用django-rest-framework做同樣的可瀏覽的API(對象中的自引用url)。 – zermelozf

回答

2

你必須使用HyperlinkedIdentityField。同樣在這種情況下,這個關係在任何方向上都不是很多,因爲這個序列化器是針對單個對象的。

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

我覺得差不多了!感謝Climax。我改成了'serializers.HyperlinkedIdentityField(view_name ='article-detail',lookup_field ='article_id')'但是我得到了'{「url」:「/ article/125 /」,「article_id」:「125」}'。我如何獲得DNS名稱才能使API真正可瀏覽?例如'{「url」:「http:// localhost:1234/article/125 /」,「article_id」:「125」}'。 – zermelozf

+1

其實所有的URL都應該默認爲絕對。從v.0.1.4(2013年4月3日)開始,您應該獲得最新副本... 改進的URL導入:包含的URL模塊現在顯示帶有前綴的完整URL – stormlifter