2016-04-10 22 views
3

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 

答えて

0

最後にそれを考え出しました。私がしなければならなかったのは、objectsモデルマネージャをデフォルト(モデルの最初のマネージャーとして定義する)にし、モデルマネージャーセットuse_for_related_fields = Trueにして、関連フィールドがデフォルトでベースモデルマネージャを使用するようにしました。

関連する問題