根据当前实例

时间:2017-03-09 14:28:04

标签: django serialization django-rest-framework django-queryset

在如下所示的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',)

1 个答案:

答案 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',)