我有两个模型,Fridge
和Product
。 Fridge
的ForeignKey为auth.user
,而Product
的ForeignKey为Fridge
,足够简单。
现在很明显,我希望用户能够仅将产品添加到他的冰箱中。我想使用DRF创建一个API,我希望在产品视图集中提供一个很好的下拉列表,因此我必须在序列化程序中执行此操作。我正在使用viewsets.ViewSet
类,因此get_serializer_context
似乎没有任何效果。
class ProductSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
fridge = serializers.PrimaryKeyRelatedField(queryset=WHAT_QUERYSET)
name = serializers.CharField(max_length=Product._meta.get_field('name').max_length)
purchase_date = serializers.DateField()
before_date = serializers.DateField()
我不知道应该在queryset
属性的fridge
关键字参数中添加什么。我不能在该范围内的任何地方询问request.user
,因为此时不存在上下文或请求变量。
答案 0 :(得分:3)
您需要的是基于发出请求的用户的动态查询集。您可以通过覆盖__init__
方法来实现此目的:
def __init__(self, *args, **kwargs):
super(ProductSerializer, self).__init__(*args, **kwargs)
request_user = self.context['request'].user
self.fields['fridge'].queryset = Fridge.objects.filter(user=request_user)
初始字段必须如下所示,因为您必须指定查询集,否则您将获得AssertionError:
fridge = serializers.PrimaryKeyRelatedField(queryset=Fridge.objects.all())
但当然会被覆盖。