简体   繁体   中英

Django Rest Framework Filtering Not working

Using Django 1.11 & djangorestframework==3.7.7, I want to return Videos where is_thumbnail=True on a GET call. However, all of my testing with filters have been returning all Videos objects.

Model:

class Videos(models.Model):
    """This class represents the Videos model."""
    uid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False)
    is_thumbnail = models.BooleanField(default=False)
    file_name = models.CharField(unique=True, max_length=64)
    file_path = models.CharField(unique=True, max_length=256)
    file_created_time = models.DateTimeField()
    owner = models.ForeignKey('auth.User',
                              related_name='videos',
                              on_delete=models.CASCADE)
    created_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Return a human readable representation of the model instance."""
        return "{}".format(self.file_name)

view:

class DetailsView(generics.RetrieveUpdateDestroyAPIView):
    """This class handles the http GET, PUT and DELETE requests."""

    serializer_class = VideosSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner)
    lookup_field = 'uid'

    def get_queryset(self):
        return Videos.objects.filter(is_thumbnail=True)

If I put a print statement inside of the get_queryset function, I don't see that statement in the log. So it seems like the function isn't being called.

api/urls.py

urlpatterns = {
    url(r'^auth/', include('rest_framework.urls',
                           namespace='rest_framework')),
    url(r'^api/videos/$', CreateView.as_view(), name="create"),
    url(r'^api/videos/(?P<uid>[0-9a-f-]+)/$',
        DetailsView.as_view(), name="details"),
    url(r'^get-token/', obtain_auth_token),
}

securedash_project/urls.py

    urlpatterns = format_suffix_patterns(urlpatterns)

urlpatterns = [
    url(r'', include('secureDash.dash.urls')),
    url(r'^dash/', include('secureDash.dash.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^', include('secureDash.api.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ok, you want to replace the value of the "get_queryset" method of the generic view "generics.RetrieveUpdateDestroyAPIView", which accesses the objects using the "uid" field setting like lookup_field to make the modification later, so I recommend that when you overwrite it the "get_queryset" method replaces them with the following:

def get_queryset(self):
    return self.get_queryset().filter(is_thumbnail=True)

The issue that I was having was that I had a CreateView class that implemented generics.ListCreateAPIView. This view has r/w endpoints so my GET calls were never getting to my DetailsView. I need to adjust my views, but for now this works to only show is_thumbnail=True Videos.

class CreateView(generics.ListCreateAPIView):
    """This class defines the (GET & POST) behavior of the rest api."""

    serializer_class = VideosSerializer
    permission_classes = (permissions.IsAuthenticated, )

    def perform_create(self, serializer):
        """Save the post data when creating a new Videos object."""
        serializer.save(owner=self.request.user)

    def get_queryset(self):
        queryset = Videos.objects.all()

        return queryset.filter(is_thumbnail=True)


class DetailsView(generics.RetrieveUpdateDestroyAPIView):
    """This class handles the http GET, PUT and DELETE requests."""

    queryset = Videos.objects.all()
    serializer_class = VideosSerializer
    permission_classes = (permissions.IsAuthenticated, IsOwner)
    lookup_field = 'uid'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM