我有两个模型,Fridge
和Product
。 Fridge
具有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())
但这当然会被覆盖。