在使用Django REST框架时,我无法在嵌套的序列化对象中显示选定的字段。
我可以正确地序列化整个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=
添加到ModelSerializerrelated_name=
试试这个:
我之所以要进行上述更改,是因为Outlet模型没有名为“Outlet_address”的属性,而是有名为“address”的属性。
类似的问题请参见此处:Django Rest framework keeps returning error on nested relationship
除了其他答案,我想补充以下,以防有人也在这里降落。
嵌套序列化要求字段名位于模型字段中才能工作。
如果我们需要一个reverse relation,那么显然在模型字段中没有这样的字段。
例如,对于问题中的特定模型,如果需要引用地址序列化程序中的所有出口,就会发生这种情况。
因此,我们需要:(a)为另一个模型的外键指定
related_name
。这是我们使用outlet_address
的地方,因为这是outlet模型中地址字段的相关名称。或者(b)如果没有相关的名称,那么使用默认的Django名称,将
_set
附加到模型名称(例如outlet_set
)。模型出口有一个“地址”字段,而不是出口地址。我建议您这样设置序列化程序:
相关问题 更多 >
编程相关推荐