class SalonCarDetailsSerializer(serializers.ModelSerializer):
salon = PrimaryKeyRelatedField(queryset=Salon.objects.filter(owner=?))
class Meta:
model = SalonCarDetails
fields = ["salon", "car", "price", "number_of_cars"]
CurrentUserDefault() 不起作用
可以在
SalonCarDetailsSerializer
中使用
serializers.SerializerMethodField
来过滤属于当前用户的沙龙,而不是直接在字段中过滤。以下是如何操作:
from rest_framework import serializers
class SalonCarDetailsSerializer(serializers.ModelSerializer):
salon = serializers.SerializerMethodField()
class Meta:
model = SalonCarDetails
fields = ["salon", "car", "price", "number_of_cars"]
def get_salon(self, obj):
request = self.context.get('request')
if request and hasattr(request, 'user'):
user = request.user
# Assuming 'owner' is the field connecting Salon to User
queryset = Salon.objects.filter(owner=user)
if queryset.exists():
return queryset.first().pk
return None
说明:
-
serializers.SerializerMethodField()
: 我们使用SerializerMethodField
来动态计算salon
字段的值。 -
get_salon(self, obj)
: 这个方法负责获取当前用户拥有的沙龙。 -
它首先尝试从
context
中获取request
对象。 -
然后,它检查用户是否已认证 (
request.user
)。 -
如果用户已认证,它会过滤
Salon
模型,查找owner
为当前用户的沙龙。 -
如果找到了匹配的沙龙,则返回第一个沙龙的主键 (
pk
)。否则,返回None
。
在视图中传递
request
:
为了使
SerializerMethodField
能访问
request
对象,需要在视图中将
request
传递给序列化器:
class SalonCarDetailsViewSet(viewsets.ModelViewSet):
serializer_class = SalonCarDetailsSerializer
def get_serializer_context(self):
context = super().get_serializer_context()
context.update({'request': self.request})
return context
这样,
SalonCarDetailsSerializer
就可以访问当前用户,并过滤属于该用户的沙龙。