Durante l'utilizzo di Django-REST-Framework, non sono in grado di visualizzare i campi selezionati in un oggetto serializzato nidificato.Django Rest Framework - La serializzazione nidificata non funziona come previsto
Sono correttamente in grado di serializzare la totalità del modello Address
, ma desidero solo alcuni campi da Address
, nidificati nel mio serializzato Outlet
. C'è un
Got AttributeError quando si cerca di ottenere un valore per il campo
outlet_address
su serializerOutletSerializer
. Il campo serializzatore potrebbe essere denominato in modo errato e non corrispondere a nessun attributo o chiave nell'istanzaOutlet
. Il testo di eccezione originale era: l'oggetto 'Outlet' non ha attributo 'outlet_address'.
api_v1/models.py
class Address(models.Model):
building = models.CharField(_("shop number, floor & building"), max_length=128)
street = models.CharField(_("street"), max_length=128, blank=True)
area = models.ManyToManyField(Area, related_name='address')
city = models.ForeignKey(City, related_name='address')
pin_code = models.CharField(_("PIN code"), max_length=6, default="")
def __unicode__(self):
return self.building + " " + self.street + " ..."
class Outlet(models.Model):
name = models.CharField(max_length=100, blank=True)
chain = models.ForeignKey(Chain, related_name='outlet', blank=True, null=True)
organization = models.ForeignKey(Organization, blank=True, null=True)
address = models.OneToOneField(Address, related_name='outlet_address')
thumbnail = AjaxImageField(upload_to='thumbnails',
max_height=200, #optional
max_width=200, # optional
crop=True) # optional
date_created = models.DateTimeField(_('date created'), default=timezone.now)
def __unicode__(self):
return self.name
api_v1/serializers.py
from rest_framework import serializers
from api_v1.models import Outlet, Address
class AddressSerializer(serializers.ModelSerializer):
#address_area = AreaSerializer(many=False)
class Meta:
model = Address
fields = ('building', 'street',)
depth = 3
class OutletSerializer(serializers.ModelSerializer):
outlet_address = AddressSerializer(many=False)
#area = serializers.CharField(source='address.area') #multiple levels of nesting?
class Meta:
model = Outlet
fields = ('id', 'name', 'thumbnail', 'outlet_address')
# fields = ('id', 'name', 'thumbnail', 'address') # this works
depth = 3
A questo punto, non è in grado di trovare l'attributo outlet_address nel modello outlet mentre mi aspetto che dovrebbe essere in grado nel serializzatore.
Got AttributeError quando si cerca di ottenere un valore per il campo
outlet_address
sul serializzatoreOutletSerializer
. Il campo serializzatore potrebbe essere denominato in modo errato e non corrispondere a nessun attributo o chiave su l'istanzaOutlet
. Il testo originale dell'eccezione era: L'oggetto 'Outlet' non ha attributo 'outlet_address'.
Come descritto in altre risposte, ho provato:
- aggiungendo
many=
al ModelSerializer - aggiungendo
related_name=
a tutti i modelli
ho visto l'articolo collegato in precedenza, ma era per i rapporti arretrati. I suoi lavori risposta perfettamente e anche ora capisco la magia del DRF un po 'meglio. Grazie! – Pranab