gpt4 book ai didi

django - 列表字段序列化程序给出 'ManyRelatedManager' 对象不是 M2M 字段的可迭代错误

转载 作者:行者123 更新时间:2023-12-03 15:45:12 27 4
gpt4 key购买 nike

我的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

我的 View 是一个简单的基于类的 View ,如下所示:
class IPGroupCreateView(generics.CreateAPIView):
queryset = IPGroup.objects.get_queryset()
serializer_class = IPGroupCreateSerializer

我的 JSON 负载如下所示:

{ "ips": [{"name":"example.com", "address":"10.1.1.9"}], "name": "ipgroup1" }



这怎么给我一个错误说明:

TypeError at /api/v1/ip-group/
'ManyRelatedManager' object is not iterable



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

最佳答案

由于一些并发症, ListField() 只有在 时才会变得方便写作 到数据库(我不确定为什么会出现这种行为)。
在您的上下文中,添加 write_only=True ListField 解决异常。因此 IPGroupCreateSerializer 将作为

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



我个人推荐使用 嵌套序列化器 来处理这种情况。所以,定义一个新的 IPSerializer 类并使用它代替 serializers.ListField()
class IPSerializer(serializers.ModelSerializer):
class Meta:
model = IP
fields = ('name', 'address')



class IPGroupCreateSerializer(serializers.ModelSerializer):
ips = IPSerializer(many=True)


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

关于django - 列表字段序列化程序给出 'ManyRelatedManager' 对象不是 M2M 字段的可迭代错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52512002/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com