列表字段序列化程序提供“ ManyRelatedManager”对象是M2M字段的不可迭代错误

时间:2018-09-26 07:13:49

标签: django serialization django-rest-framework m2m

我的models.py看起来像这样:

class IP(models.Model):
    name = models.CharField(max_length=30, unique=True)
    address = models.CharField(max_length=50, unique=True)

class IPGroup(models.Model):
    name = models.CharField(max_length=50, unique=True)
    ips = models.ManyToManyField('IP', through='IPGroupToIP')

class IPGroupToIP(BaseModel):
    ip_group = models.ForeignKey('IPGroup', on_delete=models.CASCADE)
    ip = models.ForeignKey('IP', on_delete=models.CASCADE)

现在,为了创建IPGroup,我具有以下序列化器:

class IPGroupCreateSerializer(serializers.ModelSerializer):
    ips = serializers.ListField()

class Meta:
    model = IPGroup
    fields = ['name', 'ips']

@transaction.atomic()
def create(self, validated_data):
    ips_data = validated_data.pop('ips', None)
    ip_group = IPGroup.objects.create(name=validated_data['name'])

    if ips_data:
        for ip in ips_data:
            ip_obj, created = IP.objects.get_or_create(name=ip['name'], address=ip['address'])
            IPGroupToIP.objects.create(ip_group_id=ip_group.id, ip_id=ip_obj.id)
    return ip_group

我的视图是一个基于类的简单视图,如下所示:

class IPGroupCreateView(generics.CreateAPIView):
    queryset = IPGroup.objects.get_queryset()
    serializer_class = IPGroupCreateSerializer

我的JSON有效负载如下:

  

{       “ ips”:[{“ name”:“ example.com”,“ address”:“ 10.1.1.9”}],       “名称”:“ ipgroup1”   }

这总是给我一个错误说明:

  / api / v1 / ip-group /
中的

TypeError   “ ManyRelatedManager”对象不可迭代

奇怪的是,当我检查数据库时,将创建IPGroup和M2M ips。因此,代码按预期工作,但视图以某种方式返回500服务器错误而不是创建201。我在做什么错了?

1 个答案:

答案 0 :(得分:3)

由于某些复杂性, libxt-dev 仅在 到DB时才变得很方便(我不确定为什么这种行为)。

根据您的情况,在 ListField() 中添加 write_only=True 可解决该异常。因此, ListField 将为

IPGroupCreateSerializer



我个人建议使用 嵌套序列化程序 来处理这种情况。因此,定义一个新的 class IPGroupCreateSerializer(serializers.ModelSerializer): ips = serializers.ListField(write_only=True) 类并使用它代替 IPSerializer

serializers.ListField()