is_deleted
がTrueでないオブジェクトのみを返すように、デフォルトモデルマネージャobjects
をオーバーライドしました。私はMyModel.objects.all()
を行うたび DRFシリアライザのManyToManyフィールドとOneToManyフィールドにカスタムモデルマネージャを使用
+------+------------+ | Name | is_deleted | +------+------------+ | foo | True | | bar | False | | baz | False | +------+------------+だから、私を与える -
+------+------------+ | Name | is_deleted | +------+------------+ | bar | False | | baz | False | +------+------------+
しかしManyToMany
フィールドには、私のobjects
マネージャを尊重されていません。私がuser.foo_set.all()
をするとき、私は望んでいないすべてのオブジェクトを手に入れます。それを行う方法がありますか?
私はuser.foo_set(manager='objects').all()
を行うことができますし、それは私のオブジェクトマネージャを選択し、唯一の非削除済みアイテムを与えるが、ここで問題なのだろうことを知っている -
私はDjangoの残りFrameworkを使用してToMany
フィールドをシリアル化するよ、それはですis_deleted
の値にかかわらず、私にすべてのオブジェクトを与えてください。 ToMany
フィールドのシリアライザでオブジェクトマネージャを強制する方法はありますか?
は今、私は一種のハックっぽいと思われ、これを使用しています -
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