如何插入反序列化的Django对象?

3 投票
1 回答
824 浏览
提问于 2025-04-16 23:52

我想在我的Django服务器'A'上从另一个Django服务器'B'导入一些对象。

为此,在服务器'B'上,我执行了:

python manage.py dumpdata --format=xml

这样我就得到了我想要的xml部分,然后在服务器'A'上,我尝试反序列化一个对象:

这是我在Python命令行中做的:

data="""<object pk="69" model="inventory.cinodeserver">
        <field type="CharField" name="server_name">rfrsmh81</field>
        <field type="CharField" name="server_type">Sun Fire V440</field>
        <field type="CharField" name="server_serial">0449AL2A3A</field>
        <field type="CharField" name="server_os">SunOS 5.8 HW 2/04</field>
        <field type="CharField" name="server_fw">4.18.10</field>
    </object>
"""
l=list(serializers.deserialize("xml", data))
o=l[0]
print o

<DeserializedObject: inventory.CINodeServer(pk=69)>

问题是,我已经有一个主键为69的对象,我只是想把导入的对象放在MySQL表的最后面。

所以我尝试了这个:

o.object.pk=None
o.save()

结果我得到了:

IntegrityError: (1048, "Column 'cinodecompany_ptr_id' cannot be null")

Note, the model is :

class CINodeServer(CINodeCompany):
    class Meta: 
        app_label = 'inventory'

    server_name = models.CharField(max_length=64,blank=True)
    server_type = models.CharField(max_length=64,blank=True)
    server_serial = models.CharField(max_length=64,blank=True)
    server_os = models.CharField(max_length=30,blank=True)
    server_fw = models.CharField(max_length=20,blank=True)

那么,我该如何将导入的对象添加到我的SQL表的最后呢?

1 个回答

0

你的模型缺少一个属性,叫做 'cinodecompany_ptr_id',这个在错误信息中已经说明了:

IntegrityError: (1048, "列 'cinodecompany_ptr_id' 不能为 null")

你可以查看一下你模型对应的数据库表,看看这个列的定义是什么。

你发的模型代码不完整,它是从 CINodeCompany 这个类继承的,而你没有把这个类的代码包含进来。缺少的那个字段可能就是在这个父类里定义的。

撰写回答