2017-09-20 3 views
1

j'utilisais précédemment APIViews telles que les suivantes:Django et REST ModelViewSet filtrage

views.py

class AllProgramsApi(APIView): 

    def get(self, request): 
     user = self.request.user 
     userprograms = Program.objects.filter(user=user) 
     serializer = ProgramSerializer(userprograms, many=True) 
     return Response(serializer.data) 

voici mon modèle:

class Program(models.Model): 

    program_name = models.CharField(max_length=50) 
    program_description = models.CharField(max_length=250) 
    cycles = models.ManyToManyField(Cycle) 
    is_favourite = models.BooleanField(default="False") 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 

    def get_absolute_url(self): 
     return reverse('programs:program', kwargs={'pk': self.pk}) 

    def __str__(self): 
     return self.program_name 

Maintenant, je l'ai découvert ModelViewSet, ce qui semble très pratique, mais je n'arrive pas à filtrer pour l'utilisateur comme je le faisais auparavant dans l'APIView.

ma tentative de views.py avec ModelViewSet est la suivante et cela fonctionne mais je reçois tout le contenu et pas seulement le contenu lié à un seul utilisateur.

class AllProgramsApi(ModelViewSet): 
    serializer_class = ProgramSerializer 
    queryset = Program.objects.all() 

Comment puis-je modifier la ModelViewSet pour qu'il affiche uniquement le contenu lié à l'utilisateur qui envoie la demande? Quelle est la meilleure méthode?

Merci.

Répondre

3

Vous pouvez utiliser obtenir queryset méthode, si vous en savez plus consulter la doc Filtering against the current user

class AllProgramsApi(ModelViewSet): 
    serializer_class = ProgramSerializer 
    queryset = Program.objects.all() 
    def get_queryset(self): 
     queryset = self.queryset 
     query_set = queryset.filter(user=self.request.user) 
     return query_set 
1

il y a permission_classes dans django vous pouvez ajouter des autorisations selon vos besoins ou vous pouvez créer des autorisations personnalisées

vous obtiendrez une meilleure idée de django permission

ou vous pouvez créer votre jeu de requête en définissant la méthode get_queryset.