другой набор запросов на основе разрешений в Django Rest Framework

#python #django #django-rest-framework #django-queryset #django-filter

#python #django #django-rest-framework #django-queryset #django-filter

Вопрос:

Я видел эту ссылку, но я не нашел ничего, что могло бы помочь в решении моего вопроса.

Представьте, что нам нужно создать блог, в котором сообщения имеют два статуса:

  1. is_draft
  2. опубликовано ( published == !is_draft )

Итак, каждый пользователь должен видеть все свои сообщения, независимо от того, черновик это или нет. Кроме того, другие пользователи должны видеть опубликованные сообщения остальных пользователей.

Я использую viewsets django и знаю, что у нас должен быть другой набор запросов на основе текущих пользовательских разрешений, но я не знаю как.

models.py:

 from django.db import models

# Create your models here.
from apps.authors.models import Author


class Post(models.Model):
    author = models.ForeignKey(
        Author,
        related_name="posts",
        on_delete=models.CASCADE,
    )

    title = models.TextField(
        null=True,
        blank=True,
    )

    content = models.TextField(
        null=True,
        blank=True,
    )

    is_draft = models.BooleanField(
        default=True
    )
 

views.py:

 from django.shortcuts import render
from rest_framework import viewsets, permissions
# Create your views here.
from apps.posts.models import Post
from apps.posts.serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

    def get_permissions(self):
        if self.action == "create":
            self.permission_classes = [permissions.IsAuthenticated]

        elif self.action == "list":
            pass #I don't know how can I change this part

        return super(PostViewSet, self).get_permissions()

 

serializers.py:

 from rest_framework import serializers

from apps.posts.models import Post


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

 

Комментарии:

1. Как вы определяете, что кто-то видит свои собственные сообщения или чужие? Это что-то подобное для списка сообщений? /posts/uid или это для одного поста? нравится posts/post_id ? Это было бы легче понять, если бы вы также добавили свой URL-адрес в этот набор представлений.

2. @SihanTawsik Как я могу это сделать?

3. Исходя из вопроса, я предполагаю, что вы пытаетесь показать список опубликованных сообщений. итак, как насчет изменения набора запросов здесь?

4. @SihanTawsik ты имеешь в виду Post.objects.filter(is_draft = False) ? Если да, то как насчет изменения URL-адреса? Например, автор должен видеть все свои посты!

5. Смотрите мой ответ ниже.

Ответ №1:

Измените свой набор запросов следующим образом в своем viewset. Таким образом, только ваши нужные сообщения будут доступны / разрешены для просмотра:

 from django.shortcuts import render
from django.db.models import Q
from rest_framework import viewsets, permissions
# Create your views here.
from apps.posts.models import Post
from apps.posts.serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
    serializer_class = PostSerializer

    def get_permissions(self):
        if self.action == "create":
            self.permission_classes = [permissions.IsAuthenticated]

        return super(PostViewSet, self).get_permissions()

    def get_queryset(self, *args, **kwargs):
        current_user = self.request.user
        current_author = Author.objects.get(user=current_user) #assuming your author class has foreign key to user
        return Post.objects.filter(Q(author=current_author) | Q(is_draft=False))