假設我有如下模型:
class Book(models.Model)。
title = models.CharField(max_length=254)
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
class Chapter(models.Model)。
title = models.CharField(max_length=254)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
假設用戶A創建了book。我可以通過覆寫get_queryset來限制用戶B在Book視圖集中對該書的訪問:
def get_queryset(self)。
user = User.objects.get(username=self.request.user.username)
queryset = Book.objects.filter(user=user)
return queryset
我還有一個用于添加章節的端點:
class ChapterViewSet(viewsets.ModelViewSet)。
queryset = Chapter.objects.all()
serializer_class = serializers.ChapterSerializer
模型 = Chapter
我想阻止用戶B向用戶A創建的書中添加(創建,POST)一個章節,創建這種限制的最佳做法是什么?
uj5u.com熱心網友回復:
我肯定會在序列化器層面上進行驗證......
https://www.django-rest-framework.org/api-guide/serializers/#validation
因此,如果你的序列化器看起來像這樣,我會做:
class ChapterSerializer(serializers.ModelSerializer)。
class Meta:
模型 = 章節
欄位 = ['id'/span>, 'title', 'book']
def validate_book(self, value)。
if not Book.objects. filter(id=value, user=self.context['request'].user).exists()。
raise serializers.ValidationError("this is not your book.")
uj5u.com熱心網友回復:
這可以通過改寫perform_create方法來實作。你也應該修改get_queryset方法來實作你所尋找的。你可以這樣做:
# your_app/views.py。
from rest_framework import exceptions, viewsets
from .models import book, chapter
class ChapterViewSet(viewsets.ModelViewSet)。
queryset = Chapter.objects.all()
serializer_class = serializers.ChapterSerializer
模型 = Chapter
def get_queryset(self)。
return Chapter.objects.filter(book__user=self.request.user)
def perform_create(self, serializer)。
book = serializer.validated_data['book'/span>]
if book.user != self.request.user。
raise exceptions.PermissionDenied("只有書的主人可以添加章節到里面。")
序列化器.保存()
現在,如果一個API呼叫試圖向一本不是由認證用戶創建的書添加章節,那么在回應中會回傳一個403 Permission Denied錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307454.html
標籤:
