42

Sto tentando di restituire una HttpResponse da Django Rest Framework che include i dati di 2 modelli collegati. I modelli sono:Django Rest Framework - Ottieni il campo modello correlato nel serializzatore

class Wine(models.Model): 

    color = models.CharField(max_length=100, blank=True) 
    country = models.CharField(max_length=100, blank=True) 
    region = models.CharField(max_length=100, blank=True) 
    appellation = models.CharField(max_length=100, blank=True) 

class Bottle(models.Model): 

    wine = models.ForeignKey(Wine, null=False) 
    user = models.ForeignKey(User, null=False, related_name='bottles') 

Mi piacerebbe avere un serializzatore per il modello bottiglia che include informazioni relative dal vino.

ho provato:

class BottleSerializer(serializers.HyperlinkedModelSerializer): 
    wine = serializers.RelatedField(source='wine') 

    class Meta: 
     model = Bottle 
     fields = ('url', 'wine.color', 'wine.country', 'user', 'date_rated', 'rating', 'comment', 'get_more') 

che non funziona.

Qualche idea su come potrei farlo?

Grazie :)

+0

Grazie per questo, sono quasi. Quello che @ tom-christie spiega funziona per ottenere l'oggetto stesso, ma non sono in grado di ottenere tutti i campi dall'oggetto Wine .. – bpipat

+0

Prova 'source = '*'' come argomento 'RelatedField'. – mariodev

+0

Ricevo ancora il nome Unicode nel risultato della query. E provare wine.color nei campi non funziona Che cosa cambia source = '*'? – bpipat

risposta

49

semplice, aggiungendo il WineSerializer come campo risolto.

class BottleSerializer(serializers.HyperlinkedModelSerializer): 
    wine = WineSerializer(source='wine') 

    class Meta: 
     model = Bottle 
     fields = ('url', 'wine', 'user', 'date_rated', 'rating', 'comment', 'get_more') 

con:

class WineSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Wine 
     fields = ('id', 'url', 'color', 'country', 'region', 'appellation') 

Grazie per l'aiuto @mariodev :)

+0

Felice che lo risolvi. Puoi anche spiegare per quale motivo la classe 'WineSerializer' sta per, quindi abbiamo una risposta chiara .. – mariodev

+0

Fatto, grazie per la richiesta – bpipat

+1

Ho fatto questo, ma sto ricevendo l'errore fallowing 'HyperlinkedRelatedField richiede la richiesta nel serializzatore contesto. Aggiungi context = {'request': request} 'durante l'istanziazione del serializzatore. Che cosa sto facendo di sbagliato? – arturataide