2015-05-29 8 views
6

मैं डीआरएफ 3.1 का उपयोग करके एक एपीआई बनाने का प्रयास कर रहा हूं। मैंने ModelViewSet का उपयोग करके मैनेजमेंट फ़ंक्शन बनाकर और डिफ़ॉल्ट राउटर के साथ पंजीकरण करके शुरुआत की। यह पूरी तरह से काम करता है और ब्राउज़र में देखे जाने पर डिफ़ॉल्ट एपीआई रूट व्यू उचित लिंक उत्पन्न करता है। मैंने फिर ReadOnlyModelViewSet का उपयोग कर मानक उपयोगकर्ताओं के लिए अधिक प्रतिबंधित विचार बनाए, समस्या तब हुई जब मैंने राउटर के साथ इन प्रतिबंधित विचारों को पंजीकृत करने का प्रयास किया क्योंकि ReadOnlyModelViewSets एपीआई रूट व्यू पर लिंक को ओवरराइट करने के लिए दिखाई देते हैं। जेनरेट किए गए URL काम करने के लिए दिखाई देते हैं जब ब्राउज़र में टाइप लेकिन एपीआई जड़ दृश्य पर लिंक नहीं हैं मैं अपेक्षा के अनुरूपकई विचारों के साथ Django रेस्ट फ्रेमवर्क रूटर

serializers.py

class AdminUnitSerializer(serializers.HyperlinkedModelSerializer): 
''' 
model serializer for admin users containing all fields 

''' 

url = HyperlinkedIdentityField(view_name='unit-detail') 

class Meta: 
    model = Unit 
    fields = ('url', 'id', 'name', 'symbol', 'converters_from', 'converters_to') 

class UserUnitSerializer(serializers.HyperlinkedModelSerializer): 
''' 
model serializer for standard users containing restricted set of fields 

''' 

url = HyperlinkedIdentityField(view_name='unit-detail') 

class Meta: 
    model = Unit 
    fields = ('url', 'id', 'name', 'symbol') 

views.py

class AdminUnitViewSet(viewsets.ModelViewSet): 
''' 
simple viewset providing CRUD operations on unit objects 

''' 

queryset = models.Unit.objects.all() 
serializer_class = serializers.AdminUnitSerializer 
permission_classes = (permissions.IsAdminUser,) 

class UserUnitViewSet(viewsets.ReadOnlyModelViewSet): 
''' 
read only view set providing list and detail views for unit objects 

''' 

queryset = models.Unit.objects.all() 
serializer_class = serializers.UserUnitSerializer 
permission_classes(permissions.IsAuthenticated,) 

यूआरएल। py

router.register(r'manangeunits', views.AdminUnitViewSet) 
router.register(r'readunits', views.UserUnitViewSet) 

urlpatterns = [ 
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
url(r'^rest-auth/', include('rest_auth.urls')), 
url(r'^', include(router.urls)) 
] 

इस इस

012 की तरह एक डिफ़ॉल्ट एपीआई जड़ दृश्य पेश करता है
{ 
"manangeunits": "http://localhost:8000/readunits/", 
"readunits": "http://localhost:8000/readunits/", 
} 

है कि मैं क्या देख रहा हूँ इस

{ 
"manangeunits": "htt://localhost:8000/manageunits/", 
"readunits": "htt://localhost:8000/readunits/", 
} 

यूआरएल है, जबकि 'HTT: // स्थानीय होस्ट: 8000/manageunits /' वैध और पहुँचा जा सकता है जब पता ब्राउज़र यह सिर्फ करता है में लिखा गया है एपीआई रूट दृश्य

किसी भी मदद बहुत सराहना की जाएगी

उत्तर

6

मैं एक ही मुद्दा था और सौभाग्य से एक समाधान पाया पर प्रकट नहीं।

निम्नलिखित के रूप में अपने urls.py बढ़ाएँ:

router.register(r'manangeunits', views.AdminUnitViewSet, base_name='manangeunits') 
router.register(r'readunits', views.UserUnitViewSet, base_name='readunits') 

मैं इस के पीछे जादू पता नहीं है, लेकिन यह मेरे लिए काम करता :)

0

जवाब Dario Behringer से सही है। लेकिन यह सिर्फ जादू नहीं है।

महत्वपूर्ण हिस्सा स्पष्ट base_name के अतिरिक्त है। आम तौर पर डीआरएफ आपकी क्वेरीसेट से स्वचालित रूप से base_name उत्पन्न करता है। यह यहां "base_name" के तहत समझाया गया है: www.django-rest-framework.org/api-guide/routers/। AdminUnitViewSet और UserUnitViewSet की क्वेरीसेट आंतरिक रूप से समान है।

इससे प्रभाव पड़ता है कि बाद में पंजीकृत ViewSet पूर्व पंजीकृत ViewSet को ओवरराइट करेगा जब कोई स्पष्ट नया base_name पंजीकृत नहीं होगा।

base_name Django में नामित यूआरएल बनाने के लिए ज़िम्मेदार है। अगर वहाँ एक ही नाम Django मूल रूप से केवल विचार करेंगे नवीनतम परिभाषित के साथ एक से अधिक नामित यूआरएल है: https://docs.djangoproject.com/en/1.10/topics/http/urls/#naming-url-patterns

यह रूप में सवाल में विस्तार से बताया मूल रूप से एक ही समस्या है Django Rest Framework with multiple Viewsets and Routers for the same object

संबंधित मुद्दे