2016-04-10 5 views
3

Ich habe den Standardmodellmanager objects überschrieben, um nur Objekte zurückgeben, für die is_deleted ist keine True. SoVerwenden Sie benutzerdefinierte Modellmanager für ManyToMany und OneToMany Felder auf DRF-Serializer

 
+------+------------+ 
| Name | is_deleted | 
+------+------------+ 
| foo | True  | 
| bar | False  | 
| baz | False  | 
+------+------------+ 

, wenn ich MyModel.objects.all() tun gibt mir -

 
+------+------------+ 
| Name | is_deleted | 
+------+------------+ 
| bar | False  | 
| baz | False  | 
+------+------------+ 

Aber ManyToMany Feld respektiert nicht mein objects Manager. Wenn ich user.foo_set.all() mache, bekomme ich alle Objekte, die ich nicht will. Gibt es einen Weg, es zu tun?

Ich weiß, dass ich user.foo_set(manager='objects').all() tun kann und es wird meinen Objekt-Manager auswählen und nur die nicht gelöschten Elemente geben, aber hier ist das Problem -

I Django übriges Rahmen bin mit und ToMany Feldern für die Serialisierung, wäre es gib mir alle Objekte, unabhängig von ihrem is_deleted Wert. Gibt es eine Möglichkeit, den Objektmanager auf dem Serializer für Felder zu erzwingen?

Gerade jetzt, ich bin mit dieser, die Hack-ish Art scheint -

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 

Antwort

0

Schließlich es herausgefunden. Alles, was ich tun musste, war, den Modellmanager objects als Standard festzulegen (indem Sie ihn als ersten Manager im Modell definieren) und im Modellmanager use_for_related_fields = True festzulegen, sodass die verwandten Felder standardmäßig Ihren Basismodellmanager verwenden würden.

Verwandte Themen