2015-03-12 11 views
8

kiedyś podążać ten wzór w Django Framework spoczynku (DRF) 2:W jaki sposób przesłonić zestaw kwerend get ModelViewSet w Django Rest Framework 3?

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) 

W DRF 3, teraz uzyskać:

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. 

Jak get_queryset nadpisane dla instancji rest_framework.viewsets.ModelViewSet?

Odpowiedz

8

Wyliczyłem to. Pole model z rest_framework.viewsets.ModelViewSet wydaje się być AWOL w DRF3. Teraz, jeśli zastąpisz get_queryset, musisz określić trzeci parametr na routers.DefaultRouter().register, który jest parametrem basename. Następnie funkcja nie wyłączy się i spróbuje znaleźć ją na nieistniejącym polu queryset z ModelViewSet.

+0

Proponuję użyć mojej odpowiedzi, jest dość czystszy. Spróbuj. – levi

+2

Oto odpowiednia dokumentacja: http://www.django-rest-framework.org/api-guide/routers/#usage – Seth

+0

Wpadłem w ten sam problem. Nie mam twojej odpowiedzi. Czy mógłbyś podać odpowiedź na szczegóły? – Amir

0

Aby przesłonić domyślny zestaw zapytań w DRF 3, po prostu zdefiniuj atrybut queryset w klasie FooViewSet.

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

'get_queryset()' jest dostępny, więc możesz zrobić filtrowanie na podstawie zapytania. Jeśli 'Foo' miał pole' User', mógłbym zdefiniować 'get_queryset()', aby zwrócić 'Foo.objects.filter (user = self.request.user)'. Tak więc, muszę zdefiniować 'get_queryset()' zamiast statycznego pola 'queryset'. –

+0

Zdaję sobie sprawę, że mój przykład nie był jasny co do moich zamiarów, przeprosin. –

+0

@RossRogers bez probem, jeśli chcesz dynamiczny zestaw zapytań za pomocą routera, powinieneś użyć swojego podejścia. – levi

Powiązane problemy