假設我們有兩個模型:
class Chapter(models.Model):
title = models.CharField(max_length=128)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
class Post(models.Model):
title = models.CharField(max_length=128)
body = models.TextField()
is_archived = models.BooleanField(default=False)
chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE)
和模型的默認ModelViewSet視圖集Chapter:
class ChapterViewSet(viewsets.ModelViewSet):
queryset = Chapter.objects.all()
serializer_class = ChapterSerializer
關鍵是ChapterSerializer使用在回應中PostSerializer提供post_set鍵來執行嵌套序列化。
class PostSerializer(serializers.HyperlinkedModelSerializer):
detail_url = HyperlinkedIdentityField(view_name='post-detail', read_only=True)
class Meta:
fields = ['id', 'title', 'is_archived', 'detail_url']
model = Post
class ChapterSerializer(serializers.ModelSerializer):
post_set = PostSerializer(read_only=True, many=True)
class Meta:
model = Chapter
fields = ['id', 'title', 'owner', 'post_set']
問題是我如何為這個嵌套的PostSerializer. 例如,當用戶提出GET請求時,我只想包括未歸檔的帖子(is_archived欄位設定為False),如果已完成請求的用戶不是Chapter( request.user != current_chapter.owner)的所有者。有什么辦法可以實作嗎?
uj5u.com熱心網友回復:
您可以使用prefetch_related來預取嵌套序列化程式使用的結果,可以使用Prefetch物件過濾此預取,然后過濾嵌套結果
class ChapterViewSet(viewsets.ModelViewSet):
queryset = Chapter.objects.all()
serializer_class = ChapterSerializer
def get_queryset(self):
queryset = super().get_queryset()
return queryset.prefetch_related(
Prefetch('post_set', queryset=Post.objects.filter(is_archived=False))
)
在get_queryset您必須動態執行此預取的方法中,可以通過以下方式訪問當前請求self.request
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361131.html
標籤:姜戈 Django 休息框架 django 序列化器 django-rest-viewsets
上一篇:二階關系的Django模板計數
下一篇:Firestore按檔案參考過濾
