gpt4 book ai didi

django-rest-framework - 基于当前用户的 DRF 过滤器 PrimaryKeyField

转载 作者:行者123 更新时间:2023-12-04 10:22:52 25 4
gpt4 key购买 nike

我有一个 View 设置为将书籍列表返回给用户,该列表是从基于当前登录用户的简单书籍模型中检索的。但是,我还有 ReadingSession 模型,它与 Book 和 User 都有外键关系。

当我为用户检索书籍时,我想至少返回一个主键列表,我可以用它来获取客户端的长度。

以下代码将在我的 BookSerializer 中获取完整的阅读 session 集:

from rest_framework import serializers
from books.models import Book


class BookSerializer(serializers.ModelSerializer):
readingsession_set = serializers.PrimaryKeyRelatedField(
many=True, read_only=True)

class Meta:
model = Book
fields = ["id", "title", "author", "publisher",
"publish_date", "description", "category",
"language", "small_thumbnail", "thumbnail",
"readingsession_set"]

然而,这样做的问题是它会返回所有的阅读 session ,不管 session 是否属于那个用户。

我希望能够过滤它,以便它只返回当前用户的阅读 session 。类似的东西:
readingsession_set = serializers.PrimaryKeyRelatedField(queryset=ReadingSession.objects.filter(user=user), read_only=True)

但是我尝试了各种尝试从​​ APIView 传递用户( self.request.user )的方法,但似乎都不起作用。我试过传递上下文,并尝试传递额外的 **kwargs__init__但似乎没有一个工作。

有没有办法实现这一目标?还是我采取了错误的方法?

谢谢

最佳答案

用户不在序列化程序的声明中,而是在其实例化期间。
因此,您可以过滤 queryset由用户在 __init__ 内方法。

from rest_framework import serializers

from bar.models import Foo


class RandomSerializer(serializers.Serializer):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
user_foos = Foo.objects.filter(user=self._user)
self.fields['foo_ids'] = serializers.PrimaryKeyRelatedField(
required=False,
many=True,
read_only=False,
queryset=user_foos,
default=user_foos)

@property
def _user(self):
request = self.context.get('request', None)
if request:
return request.user
不要忘记通过 request对象到上下文中的序列化程序(如有必要,例如,使用简单的 APIView
from rest_framework import views


class RandomView(views.APIView):
serializer_class = RandomSerializer

def post(self, request):
serializer = self.serializer_class(
data=request.data, context={'request': request})
# ...

serializer = RandomSerializer(data=request.data, context={'request': request}

关于django-rest-framework - 基于当前用户的 DRF 过滤器 PrimaryKeyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60759217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com