Python 对DRF序列化程序上的多个和一个域使用自定义模型管理器

Python 对DRF序列化程序上的多个和一个域使用自定义模型管理器,python,django,django-rest-framework,Python,Django,Django Rest Framework,我已经覆盖了默认的模型管理器对象,只返回已删除的对象不为真 +------+------------+ | Name | is_deleted | +------+------------+ | foo | True | | bar | False | | baz | False | +------+------------+ 但是ManyToMany字段不尊重我的对象管理器。当我执行user.foo\u set.all()时,我得到了我不想

我已经覆盖了默认的模型管理器
对象
,只返回已删除
的对象
不为真

+------+------------+ | Name | is_deleted | +------+------------+ | foo | True | | bar | False | | baz | False | +------+------------+ 但是
ManyToMany
字段不尊重我的
对象
管理器。当我执行
user.foo\u set.all()
时,我得到了我不想要的所有对象。有办法吗

我知道我可以执行
user.foo\u set(manager='objects').all()
,它会选择我的对象管理器并只提供未删除的项目,但问题是-

我使用的是Django Rest框架,对于许多字段的序列化,它将提供所有对象,而不管它们的
是否被删除
值。是否有一种方法可以在序列化程序上对许多字段强制执行对象管理器

现在,我在用这个,看起来有点像黑客-

class MySerializer(serializers.HyperlinkedModelSerializer):
    things = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ('id', 'things')

    def get_things(self, obj):
        return many_field_serialize(obj, 'things', ThingSerializer)





def many_field_serialize(obj, field_name, serializer_class):
    """
    Serializer, by default would give us all the related results, while we
    want to ignore the ones which have been marked as deleted or archived.
    We have our custom modele manager for that - `objects` but serializer
    doesn't use that. So the only solution at this time seems to manually
    get all the related fields and apply our `objects` model manager on it.

    There should be a better way to do it, or we'll keep duplicating this
    logic for every related field serializer.
    """
    items = getattr(obj, field_name)(manager='objects').all()
    serialized_items = serializer_class(
        instance=items, many=True
    )
    return serialized_items.data

我终于明白了。我所要做的就是将
对象
模型管理器设置为默认值(通过将其定义为模型中的第一个管理器),并在模型管理器集中
使用\u for\u related\u fields=True
,以便相关字段在默认情况下使用基本模型管理器

class MySerializer(serializers.HyperlinkedModelSerializer):
    things = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ('id', 'things')

    def get_things(self, obj):
        return many_field_serialize(obj, 'things', ThingSerializer)





def many_field_serialize(obj, field_name, serializer_class):
    """
    Serializer, by default would give us all the related results, while we
    want to ignore the ones which have been marked as deleted or archived.
    We have our custom modele manager for that - `objects` but serializer
    doesn't use that. So the only solution at this time seems to manually
    get all the related fields and apply our `objects` model manager on it.

    There should be a better way to do it, or we'll keep duplicating this
    logic for every related field serializer.
    """
    items = getattr(obj, field_name)(manager='objects').all()
    serialized_items = serializer_class(
        instance=items, many=True
    )
    return serialized_items.data