2016-03-11 16 views
0

當使用命名空間時,我讀了很多關於影響DRF超鏈接的問題。但到目前爲止,我沒有設法通過遵循Github和Stackoverflow上的提示和建議來解決我的問題。Django Rest Framework超鏈接命名空間配置不當

我最近增加命名空間來我的urls.py

urlpatterns = patterns('', 
        # API 
        url(r'^api/', include(core_api_router.urls, namespace='api')), 
        url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
        url(r'^api-docs/', include('rest_framework_swagger.urls', namespace='api_docs'), name='api_docs'), 
        ) 

這裏是我的api.py

class MyBaseModelSerializer(DynamicModelSerializerMixin, serializers.ModelSerializer): 

    status = serializers.HyperlinkedRelatedField(many=True, view_name='api:mybasemodel', read_only=True) 

     class Meta: 
      model = models.MyBaseModel 
      fields = ('id', 'href', 'url', 'sid', 'name', 'status', 'created',) 
      ordering_fields = '__all__' 
      ordering = ('name',) 

class ChangeViewSet(viewsets.ModelViewSet): 
    queryset = models.MyBaseModel.objects.all().select_related('status') 
    serializer_class = MyBaseModelSerializer 

router.register('core/mybasemodel', MyBaseModelViewSet) 


class MyRelatedModelSerializer(serializers.ModelSerializer): 

    id = serializers.UUIDField(read_only=True) 
    href = serializers.HyperlinkedIdentityField(view_name='api:myrelatedmodel') 

     class Meta: 
      fields = ('id', 'href', 'key', 'comment', 'position', 'created') 
      ordering_fields = '__all__' 
      ordering = ('position',) 

class MyRelatedViewSet(viewsets.ModelViewSet): 
    queryset = models.MyRelatedModel.objects.all() 
    serializer_class = MyRelatedSerializer 

router.register('core/myrelatedmodel', MyRelatedModelViewSet) 

在我的測試我檢查我是否能夠通過API

修改現有對象
def test_api_update(self): 
    # Create an entry 
    entry = self.Meta.factory.create() 

    url = reverse('api:'+self.api_model_url+'-detail', args=[str(entry.id)]) 

    data = {'sid': 'Modified Entry'} 

    # Check that an entry can be altered by an administrator via the API 
    self.api_client.login(username='admin', password='admin') 
    response = self.api_client.patch(url, data, format='json') 
    content = self.parse_json_response(response, Status.HTTP_200_OK) 
    self.assertEqual(content['sid'], 'Modified Entry') 

Django引發此例外:

django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "mybasemodel-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. 
dmw.apps.core.views: ERROR: E500 : 127.0.0.1 : admin-user : http://testserver/api/core/api:mybasemodel/121e6850-3cd8-4795-d9bc-axsa04d1bd12/ 

我的應用程序上的Python 3.4運行在Django 1.8.9,Django的REST框架3.3.2和我曾嘗試與兩個:

router = routers.DefaultRouter() 
提前

routeur = routeurs.SimpleRouter() 

謝謝您幫幫我!

乾杯!

+0

我的回答對你有幫助嗎?如果願意,請接受。 – ilse2005

+0

它仍然不起作用,但我現在沒有時間進一步調查..我會接受你的回答,因爲這是解決這個問題的第一步! :) –

+0

它應該適用於簡單和默認路由器嗎? –

回答

2

看起來問題出在你的兩個串行器MyBaseModelSerializerMyRelatedModelSerializerHyperlinkedIdentityField。 在view_name中,您必須指定完整的名稱,而不僅僅是您的基名。從docs

view_name - 應該用作關係目標的視圖名稱。如果你使用的是標準路由器類,這將是一個格式爲-detail的字符串。

所以你應該添加-detail有(如你在測試做):

# MyBaseModelSerializer 
status = serializers.HyperlinkedRelatedField(many=True, view_name='api:mybasemodel-detail', read_only=True) 

# MyRelatedModelSerializer 
href = serializers.HyperlinkedIdentityField(view_name='api:myrelatedmodel-detail') 
0

遇到了類似的問題,在serializer.py修正場解決。檢查您的字段對應於模型字段。任何不匹配的字段都會產生這種錯誤。

比如我默認的認證模式有以下字段: (從Django的驗證模式的默認域運行的遷移後)

id, first_name , last_name, password, username,last_login, is_active, is_active, date_joined and email 

什麼序列化程序是:從你的模型拿起指定的字段,然後將其轉換爲json用於API處理。

因此,如果您命令序列化程序獲取當前不存在於相同模型(表)的數據庫中的那些字段,則會引發此錯誤。

我希望它解決。 :)

+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/16728198) –