在使用 Django-REST-Framework 时,我无法在嵌套的序列化对象中显示选定的字段。
我能够正确地序列化整个 Address
模型,但我只需要来自 Address
的几个字段,嵌套在我序列化的 Outlet
。有一个
Got AttributeError when attempting to get a value for field
outlet_address
on serializerOutletSerializer
. The serializer field might be named incorrectly and not match any attribute or key on theOutlet
instance. Original exception text was: 'Outlet' object has no attribute '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
此时,它无法在 Outlet 模型中找到 outlet_address 属性,而我希望它应该能够在序列化程序中找到。
Got AttributeError when attempting to get a value for field
outlet_address
on serializerOutletSerializer
. The serializer field might be named incorrectly and not match any attribute or key on theOutlet
instance. Original exception text was: 'Outlet' object has no attribute 'outlet_address'.
如其他答案所述,我已经尝试过:
- 将
many=
添加到 ModelSerializer - 将
related_name=
添加到所有模型
最佳答案
试试这个:
from rest_framework import serializers
from api_v1.models import Outlet, Address
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = ('building', 'street',)
depth = 3
class OutletSerializer(serializers.ModelSerializer):
address = AddressSerializer(many=False) # make it address, not outlet_address
class Meta:
model = Outlet
fields = ('id', 'name', 'thumbnail', 'address') # make this address as well, not outlet_address
depth = 3
我之所以要进行上述更改,是因为 Outlet 模型没有名为“outlet_address”的属性,它有一个名为“address”的属性。
请参阅此处了解类似问题:Django Rest framework keeps returning error on nested relationship
关于python - Django Rest Framework - 嵌套序列化未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227297/