有没有一种方法可以为django-rest框架中的嵌套关系(嵌套序列化程序类)动态指定查询集



假设我们有两个模型:

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)

Chapter型号的默认ModelViewSet视图集:

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请求时,如果已经提出请求的用户不是Chapter(request.user != current_chapter.owner(的所有者,则我只想包括未归档的帖子(is_archived字段设置为False(。有什么办法实现它吗?

您可以使用prefetc_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访问

相关内容

  • 没有找到相关文章

最新更新