Django Rest Framework-嵌套序列化未按预期工作

2024-04-25 01:30:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用Django REST框架时,我无法在嵌套的序列化对象中显示选定的字段。

我可以正确地序列化整个Address模型,但我只需要Address中的几个字段,它们嵌套在我的序列化Outlet中。有一个

Got AttributeError when attempting to get a value for field outlet_address on serializer OutletSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Outlet 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 serializer OutletSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Outlet instance. Original exception text was: 'Outlet' object has no attribute 'outlet_address'.

如其他答案所述,我尝试过:

  1. many=添加到ModelSerializer
  2. 向所有模型添加related_name=

Tags: nameselftruefield序列化addressmodelsmax
3条回答

试试这个:

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

除了其他答案,我想补充以下,以防有人也在这里降落。

嵌套序列化要求字段名位于模型字段中才能工作。

如果我们需要一个reverse relation,那么显然在模型字段中没有这样的字段。

例如,对于问题中的特定模型,如果需要引用地址序列化程序中的所有出口,就会发生这种情况。

因此,我们需要:(a)为另一个模型的外键指定related_name。这是我们使用outlet_address的地方,因为这是outlet模型中地址字段的相关名称。

或者(b)如果没有相关的名称,那么使用默认的Django名称,将_set附加到模型名称(例如outlet_set)。

模型出口有一个“地址”字段,而不是出口地址。我建议您这样设置序列化程序:

class OutletSerializer(serializers.ModelSerializer):
    address = AddressSerializer(many=False)

    class Meta:
        model = Outlet
        fields = ('id', 'name', 'thumbnail', 'address')
        depth = 2

相关问题 更多 >