From f3d63deabe8d0ea026754e93f390f5357c65bfd1 Mon Sep 17 00:00:00 2001 From: eofs Date: Tue, 15 Jan 2013 11:23:07 +0200 Subject: [PATCH] Exclude intermediate models from reverse fields. Always dealt reverse relational fields as Many fields. --- rest_framework/serializers.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 2b6677545..34d8a8759 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -371,10 +371,22 @@ class ModelSerializer(Serializer): _options_class = ModelSerializerOptions def get_reverse_fields(self, opts, fields): + # Construct a list of all relations relations = [] relations += [obj for obj in opts.get_all_related_objects() if obj.field.serialize] relations += [obj for obj in opts.get_all_related_many_to_many_objects() if obj.field.serialize] - return [rel.field for rel in relations] + + # Construct a list of intermediate models + exclude = [] + for field in fields: + if field.rel and hasattr(field.rel, 'through'): + exclude.append(field.rel.through) + # Intermediate models from reverse relations + for rel in relations: + if rel.field.rel and hasattr(rel.field.rel, 'through'): + exclude.append(rel.field.rel.through) + + return [rel.field for rel in relations if rel.model not in exclude] def get_default_fields(self): """ @@ -456,6 +468,9 @@ class ModelSerializer(Serializer): """ Creates a default instance of a flat relational field. """ + # Reverse relational fields must be dealt as Many fields + if model_field.model is not self.opts.model: + to_many = True # TODO: filter queryset using: # .using(db).complex_filter(self.rel.limit_choices_to) kwargs = {