我的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。我在做什么错了?
答案 0 :(得分:3)
由于某些复杂性, libxt-dev
仅在 写 到DB时才变得很方便(我不确定为什么这种行为)。
根据您的情况,在 ListField()
中添加 write_only=True
可解决该异常。因此, ListField
将为
IPGroupCreateSerializer
我个人建议使用 嵌套序列化程序 来处理这种情况。因此,定义一个新的 class IPGroupCreateSerializer(serializers.ModelSerializer):
ips = serializers.ListField(write_only=True)
类并使用它代替 IPSerializer
serializers.ListField()