Reputation: 450
Right now i am successfully able to return every article without issue. But what i want to do is this: I want to return the articles,only followed by the current authenticated user. How can i do it?
models.py
class User(AbstractUser,PermissionsMixin):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
email = models.CharField(max_length=255,unique=True)
username =models.CharField(max_length=80,unique=True,default='undefinedusername')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
class Article(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles')
caption = models.CharField(max_length=250)
class UserFollow(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='following')
profile = models.ForeignKey(User,on_delete=models.CASCADE,related_name='followers')
serializers.py
class UserSerializer(DynamicFieldsMixin,serializers.ModelSerializer):
userfollowers_set = UserFollowSerializer(source='followers',required=False,many=True)
userfollowing_set = UserFollowSerializer(source='following',required=False,many=True)
class Meta:
model = User
fields = ('id','email','username','userfollowing_set','userfollowers_set')
views.py
class ArticleViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = Article.objects.all().order_by('-timestamp')
serializer_class = ArticleSerializer
Error 1:
class FollowedAuthorFilterBackend(filters.BaseFilterBackend):
NameError: name 'filters' is not defined
Upvotes: 1
Views: 79
Reputation: 476813
You can filter with:
class ArticleViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = Article.objects.all().order_by('-timestamp')
serializer_class = ArticleSerializer
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
author__following__author=request.user
)
We can also move the filtering logic into a FilterBackend
:
class FollowedAuthorFilterBackend(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
return queryset.filter(
author__following__profile=request.user
)
Then we can plug in this FollowedAuthorFilterBackend
where we want to filter this, so we can rewrite our ArticleViewSet
to:
class ArticleViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
queryset = Article.objects.all().order_by('-timestamp')
serializer_class = ArticleSerializer
filter_backends = [FollowedAuthorFilterBackend]
# no get_queryset
Upvotes: 2