2015-12-15 2 views
6

У меня есть родительская и взаимно родственная дочерняя модель, и я хотел бы отображать поля из дочернего объекта в родительском представлении (read only). В настоящее время я достиг этого с пользовательской реализацией to_representation, но это кажется очень привлекательным, и мне интересно, нет ли более простого способа достичь этого.Django rest framework представляет собой сглаженный вложенный объект

Это осложняется тем фактом, что моя родственная модель связана через свойство.

Так вот конкретный пример: По умолчанию связанный объект будет обработан следующим образом:

{ 
    parent_name:'Bob', 
    child:{ 
    name:'Alice' 
    } 
} 

Это то, что я хочу, и в настоящее время получить с моей to_representation:

{ 
    parent_name:'Bob',  
    child_name:'Alice' 
} 

Мои модели выглядят следующим образом:

class ChildModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 

class ParentModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 
    _child = models.ForeignKey('ChildModel', null=True) 

    @property 
    def child(self): 
     return self._most_recent_status 

    @name.setter 
    def child(self, value): 
     self._child = value 

Здесь являются моими сериализаторами:

class FlatChildField(serializers.RelatedField): 
    def to_representation(self, value): 
     return value.name 


class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = FlatChildField(source='_child', read_only=True) 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

Для более простого решения получить плоское представление связанных моделей я был бы признателен.

Для полноты мне было бы интересно услышать, есть ли более простое решение для «нормальных» связанных моделей (т. Е. Не полей модели свойств). Я искал эквивалент синтаксиса запроса модели django related_model__field, но я не могу этого найти. Это существует для рамки django rest?

Большое спасибо

ответ

13

Самый простой способ заключается в использовании source:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.CharField(source='_child.name', read_only=True) 

class Meta: 
    model = Parent 
    fields = ('name', 'child_name') 
+0

Это работает очень, спасибо. –

+0

Это работает также без read_only, что отлично подходит для сглаживания вложенных моделей! – alekwisnia

3

Вы можете использовать SerializerMethodField, это избавит вас действительно много работы, и это так чисто и тривиальна:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.SerializerMethodField('get_child_name') 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

    def get_child_name(self, obj): 
     return obj._child.name 
Смежные вопросы