Django Фильтрация модельного набора

У меня есть две модели Category & Post. В модели Post есть внешний ключ category. На основе категории я хочу отфильтровать данные, чтобы показать пост по категориям. Вот мой код.

models.py

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='news', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)    
        verbose_name_plural = "Category"     

    def __str__(self):                           
        full_path = [self.name]                  
        k = self.parent
        while k is not None:
            full_path.append(k.name)
            k = k.parent
        return ' -> '.join(full_path[::-1])

class Post(models.Model):
    NEWS_TYPE = (('Images','Images'),('Multi-Images','Multi-Images'),('Image-Text','Image-Text'),
                 ('Audio-Video','Audio-Video'),('Audio-Video-Text','Audio-Video-Text'),('Audio','Audio'),
                 ('Audio-Text','Audio-Text'))
    POST_STATUS = (('Pending','Pending'),('Verified','Verified'),('Un-Verified','Un-Verified'),
              ('Published','Published'),('Mint','Mint'))
    category = models.ForeignKey(Category, related_name='Category', on_delete=models.CASCADE)
    post_type = models.CharField(max_length=100, verbose_name='Post Type', choices=NEWS_TYPE)
    title = models.TextField(verbose_name='News Title')
    content = models.TextField(verbose_name='News Content')
    hash_tags = models.CharField(max_length=255, verbose_name='Hash Tags')
    source = models.CharField(max_length=255, verbose_name='News Source')
    author = models.ForeignKey(User, related_name='Post', on_delete=models.CASCADE)
    views = models.ManyToManyField(User,related_name='Views', blank=True)
    likes = models.ManyToManyField(User, related_name='Likes', blank=True)
    dislikes = models.ManyToManyField(User, related_name='Dislikes', blank=True)
    status = models.CharField(max_length=20, verbose_name='Status', choices=POST_STATUS, default='Pending')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return (self.post_type)+ '-' +self.title

serializers.py

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = '__all__'

class PostSerializer(serializers.ModelSerializer):
    category = CategorySerializer(many=True, read_only=True)
    class Meta:
        model = Post
        fields = ('category','post_type','title','content','hash_tags','source','author','views',
                  'likes','dislikes','status')

views.py

class CategoryAPI(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

class PostAPI(viewsets.ModelViewSet):
    serializer_class = PostSerializer

    def get_queryset(self):
        news_post = Post.objects.all()
        return news_post

    def retrieve(self, request, *args, **kwargs):
        params = kwargs
        print(params['pk'])
        category = Category.objects.filter(name=params['pk'])
        serializer = CategorySerializer(category, many=True)
        return Response(serializer.data)

Я пробовал решать этим способом, но он выдает 'PostSerializer' object has no attribute 'get_category'. Может я что-то делаю не так? Пожалуйста, ваша поддержка была бы полезна. Спасибо

Я думаю, что тогда ваш подход должен быть обратным, то есть вы должны добавить список Posts к вашему Category:

serializers.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('category','post_type','title','content','hash_tags','source','author','views',
                  'likes','dislikes','status')

class CategorySerializer(serializers.ModelSerializer):
    posts = PostSerializer(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ['name', 'slug', 'parent', 'posts']

Внимание: Я изменил связанное имя вашего поля категории в модели Post на 'posts'

Это должно показать вам все Posts при извлечении категории. Нет необходимости переопределять какой-либо метод в ваших представлениях:

class CategoryAPI(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

class PostAPI(viewsets.ModelViewSet):
    queryset = Post.obejcts.all()
    serializer_class = PostSerializer
Вернуться на верх