Django Rest Framework - 序列化程序中的ForeignKey过滤

时间:2016-02-23 11:03:39

标签: python django django-rest-framework

我有两个模型,FridgeProductFridge的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,因为此时不存在上下文或请求变量。

1 个答案:

答案 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())

但当然会被覆盖。