2015-12-15 26 views
6

Ho un genitore e un modello figlio correlato uno a uno e vorrei rendere i campi dal piano del bambino nella rappresentazione genitore (read only). Attualmente, l'ho raggiunto con un'implementazione personalizzata to_representation ma sembra molto coinvolgente e mi chiedo se non ci sia un modo più semplice per raggiungere questo obiettivo.Il quadro di riposo di Django rappresenta l'oggetto nidificato di appiattimento

È reso più complicato dal fatto che il mio modello correlato è collegato tramite una proprietà.

Così qui è l'esempio concreto: Per impostazione predefinita un oggetto correlato sarebbe resa come:

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

Questo è quello che voglio e attualmente ottenere con la mia to_representation:

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

I miei modelli assomiglia a questo:

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 

Qui sono i miei serializzatori:

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') 

Per una soluzione più semplice per ottenere una rappresentazione piatta di modelli correlati, sarei grato.

Per completezza, sarei interessato a sapere se esiste una soluzione più semplice per i modelli correlati "normali" (vale a dire non anche i campi del modello di proprietà). Stavo cercando l'equivalente della sintassi della query del modello django di related_model__field, ma non riesco a trovarlo. Esiste per la struttura del riposo django?

Molte grazie

risposta

13

Il modo più semplice sarebbe quella di utilizzare 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

Funziona molto, grazie. –

+0

Funziona anche senza read_only, il che è ottimo per appiattire i modelli annidati! – alekwisnia

3

Si può usare SerializerMethodField, consente di risparmiare davvero un sacco di lavoro ed è così pulito e banale:

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 
Problemi correlati