2015-03-12 9 views
8

मैं Django बाकी फ्रेमवर्क (डीआरएफ) 2 में इस पैटर्न का पालन करते थे:आप Django Rest Framework 3 में ModelViewSet की get_queryset को ओवरराइड कैसे करते हैं?

class Foo(models.Model): 
    user = models.ForeignKey(User) 

class FooSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Foo 
     fields = ('url') 

class FooViewset(viewsets.ModelViewSet): 
    def get_queryset(self): 
     return Foo.objects.filter(user=self.request.user) 
    serializer = FooSerializer 
    model = Foo # <-- the way a ModelViewSet is told what the object is in DRF 2 

[ in urls.py] 
from rest_framework import routers 
router = routers.DefaultRouter() 
router.register('Foo', views.FooViewSet) 

डीआरएफ 3 में, मैं अब मिलती है:

AssertionError at/
`base_name` argument not specified, and could not automatically 
determine the name from the viewset, as it does not have a 
`.queryset` attribute. 

कैसे get_querysetrest_framework.viewsets.ModelViewSet का एक उदाहरण के लिए ओवरराइड की गई है?

उत्तर

8

यह पता लगाया गया। modelrest_framework.viewsets.ModelViewSet का क्षेत्र डीआरएफ 3 में एडब्ल्यूओएल प्रतीत होता है। अब, यदि आप get_queryset को ओवरराइड करते हैं तो आपको routers.DefaultRouter().register पर एक तीसरा पैरामीटर निर्दिष्ट करने की आवश्यकता है जो basename पैरामीटर है। फिर, फ़ंक्शन बंद नहीं होगा और इसे ModelViewSet के मौजूदा queryset फ़ील्ड पर खोजने का प्रयास करें।

+0

मेरा सुझाव है कि मेरा जवाब उपयोग करें, काफी साफ है। कोशिश करो। – levi

+2

यहां प्रासंगिक दस्तावेज है: http://www.django-rest-framework.org/api-guide/routers/#usage – Seth

+0

मैं एक ही समस्या में गिर गया हूं। मुझे आपका जवाब नहीं मिला है। क्या आप विवरण का उत्तर दे सकते हैं? – Amir

0

डीआरएफ 3 में डिफ़ॉल्ट क्वेरीसेट को ओवरराइट करने के लिए, विशेषता को परिभाषित करें FooViewSet कक्षा को सफ़ेद करें।

class FooViewset(viewsets.ModelViewSet): 
    queryset = Foo.objects.all() 
+2

'get_queryset()' उपलब्ध है ताकि आप प्रति-अनुरोध के आधार पर फ़िल्टरिंग कर सकें। यदि 'Foo' का' उपयोगकर्ता 'फ़ील्ड था, तो मैं 'foo.objects.filter (user = self.request.user)' वापस करने के लिए' get_queryset() 'को परिभाषित कर सकता था। इस प्रकार, मुझे स्थिर 'क्वेरीसेट' फ़ील्ड के बजाय 'get_queryset()' को परिभाषित करने की आवश्यकता है। –

+0

मुझे एहसास है कि मेरा उदाहरण मेरे इरादे, माफी के रूप में स्पष्ट नहीं था। –

+0

@RossRogers कोई probem, यदि आप राउटर का उपयोग कर गतिशील क्वेरीसेट चाहते हैं, तो आपको अपने दृष्टिकोण का उपयोग करना चाहिए। – levi