在如下所示的HyperlinkedModelSerializer中,如何根据" current"过滤other_model_objects
字段的相关实例集。模型的实例? (也许以某种方式使用queryset参数?)
class MyModelSerializer(serializers.HyperlinkedModelSerializer):
other_model_objects = serializers.HyperlinkedRelatedField(
many=True,
queryset=OtherModel.objects.filter(foo=current_instance.field),
view_name='othermodel-detail'
)
class Meta:
model = MyModel
fields = ('other_model_objects',)
答案 0 :(得分:3)
您是否尝试过按照文档CustomRelationalFields中的说明对HyperlinkedModelSerializer
进行子类化并覆盖get_queryset
?
类似的东西:
class MyFilteredHyperlinkedRelatedField(serializers.HyperlinkedRelatedField):
def get_queryset(self):
queryset = super().get_queryset()
# ... filter queryset
return queryset
class MyModelSerializer(serializers.HyperlinkedModelSerializer):
other_model_objects = MyHyperlinkedRelatedField(
many=True,
queryset=OtherModel.objects.all(),
view_name='othermodel-detail'
)
class Meta:
model = MyModel
fields = ('other_model_objects',)
我认为您可以使用MyModelSerializer
访问get_queryset
中的self.parent
个实例,但我不确定是否已记录/稳定。
修改强>
queryset
参数(和get_queryset
方法)仅用于创建或更新期间的验证。它不是关于检索字段的值,而是关于该字段的允许值。
如果您想根据实例过滤值,我建议您使用返回过滤值的方法来更新模型:
class MyModel:
...
def filtered_other_model(self):
return self.other_model_relation_name.filter(....)
然后使用source参数:
class MyModelSerializer(serializers.HyperlinkedModelSerializer):
other_model_objects = serializers.HyperlinkedRelatedField(
many=True,
queryset=OtherModel.objects.all(),
view_name='othermodel-detail',
source = 'filtered_other_model'
)
class Meta:
model = MyModel
fields = ('other_model_objects',)