#python #django #django-rest-framework #django-queryset #django-filter
#python #django #django-rest-framework #django-queryset #django-filter
Вопрос:
Я видел эту ссылку, но я не нашел ничего, что могло бы помочь в решении моего вопроса.
Представьте, что нам нужно создать блог, в котором сообщения имеют два статуса:
- is_draft
- опубликовано (
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))