我有两个模型,FridgeProductFridge具有auth.user的ForeignKey,而Product具有Fridge的ForeignKey,非常简单。

现在很明显,我希望用户只能将产品添加到他的冰箱中。我想使用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,因为那时没有上下文或请求变量。

最佳答案

您需要的是基于发出请求的用户动态查询集。您可以通过重写__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)


初始字段必须看起来像这样,因为您必须先指定queryset,否则将获得AssertionError:

    fridge = serializers.PrimaryKeyRelatedField(queryset=Fridge.objects.all())


但这当然会被覆盖。

10-04 12:11