【问题标题】:Django Rest Framework - Nested Serialization not working as expectedDjango Rest Framework - 嵌套序列化未按预期工作
【发布时间】:2016-01-18 13:27:03
【问题描述】:

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

我能够正确地序列化整个Address 模型,但我只想要Address 中的几个字段,嵌套在我的序列化Outlet 中。有一个

尝试在序列化程序 OutletSerializer 上获取字段 outlet_address 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Outlet 实例上的任何属性或键都不匹配。 原始异常文本为:“Outlet”对象没有“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 属性,而我希望它应该能够在序列化程序中找到。

尝试获取字段值时出现 AttributeError outlet_address 在序列化程序 OutletSerializer 上。序列化器 字段可能命名不正确,并且与任何属性或键不匹配 Outlet 实例。原始异常文本是:“出口”对象 没有属性“outlet_address”。

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

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

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    除了其他答案,我想添加以下内容,以防有人也来到这里。

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

    如果我们需要reverse relation,那么模型字段中显然不会有这样的字段。

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

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

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

    【讨论】:

    • 非常有帮助@Wtower。我表示感谢。
    【解决方案2】:

    Model Outlet 有一个“地址”字段,而不是 outlet_address。我建议您像这样设置您的序列化程序:

    class OutletSerializer(serializers.ModelSerializer):
        address = AddressSerializer(many=False)
    
        class Meta:
            model = Outlet
            fields = ('id', 'name', 'thumbnail', 'address')
            depth = 2
    

    【讨论】:

      【解决方案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

      【讨论】:

      • 我之前确实看到了链接的文章,但它是针对反向关系的。您的答案完美无缺,现在我对 DRF 魔术的理解也更好了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2018-02-17
      • 1970-01-01
      • 2018-06-23
      相关资源
      最近更新 更多