django - 如何向 Django 中的模型添加临时字段?

标签 django json django-models model

我正在开发一个网络应用程序,用户可以在其中创建多个相关元素,然后将这些元素保存到数据库中。 Web 应用不知道数据库中的主键是什么,因此它为每个元素分配一个 UUID。这些 UUID 与数据库中的每个元素一起保存。当 webapp 将数据发送到 web 服务器以放入数据库时​​,它使用 JSON 对所有内容进行编码。然后,网络服务器使用 serializers.deserialize('json', DATA) 反序列化 JSON。但是,某些模型具有外键,这些外键在 JSON 有效负载中作为对关联元素的 UUID 的引用而不是数据库 ID 进行发送。例如,我们可能有一个简单的链接对象:

class Link(models.Model):
    uuid = models.CharField(max_length=32)
    source = models.ForeignKey(Node, related_name='source')
    target = models.ForeignKey(Node, related_name='target')

如果源的 id 值为 2,而目标的 id 值为 12,这将被序列化为 JSON,如下所示:

{"uuid": "[some long uuid]",
 "source": 2,
 "target": 12}

但是,因为在这种情况下我们不知道源和目标的数据库 ID,可能是因为它们还没有设置,我能做的最好的就是像这样传入 UUID:

{"uuid": "[some long uuid]", 
 "sourceuuid": "[uuid of source]", 
 "targetuuid": "[uuid of target]"}

不幸的是,当我对数据调用 serializers.deserialize 时,这引发了 FieldDoesNotExist: Link has no field named u'sourceuuid' 异常。

我想找到一种方法,我可以传递 UUID,然后在数据库保存适当的部分或在必要时查找它们后,让数据库填充 ID。我不想在数据库中保存 sourceuuidtargetuuid,因为保存整数的空间要少得多,而且索引也应该更快。

所以,我正在寻找的是一个临时字段。我可以实例化和引用的一个,但永远不会保存回数据库。关于如何创建这样的东西有什么想法吗?

更新更多说明

感谢到目前为止的帮助,我知道它们是 Python 对象,我可以为对象分配任意字段。但是,问题是 serializers.deserialize('json', INDATA) 会抛出错误。

作为引用,这里有反序列化器喜欢的大量 JSON,它具有外键及其 ID:

ser='''[{"pk": 1, "model": "myapp.link", 
         "fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                    "source": 2,
                    "target": 12}}]'''
serializer.deserialize('json',ser)

不过,我能提供的是:

ser='''[{"pk": 1, "model": "myapp.link",
         "fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                    "sourceuuid": "11111111-2222-3333-4444-555555555555",
                    "targetuuid": "66666666-7777-8888-9999-000000000000"}}]'''
serializer.deserialize('json',ser)
FieldDoesNotExist: Link has no field named u'sourceuuid'

我需要将虚拟字段作为实际字段的原因是因为反序列化需要实际字段。

最佳答案

我不确定你到底想做什么。但请记住,Django 模型只是 Python 对象——而 Python 对象是完全动态的。因此,即使模型上没有定义 uuid 字段,执行 obj.uuid = whatever 也是完全有效的。

关于django - 如何向 Django 中的模型添加临时字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1892577/

相关文章:

Django--停用用户帐户而不是删除它

python - 如何在 Django 中正确使用 auto_created 属性?

python - django 导入导出不适用于 mptt

django - Django 模板中的字符串操作

javascript - 如何在页面加载时在 HTML 选择选项中选择 JSON 结果

java - 如何在 java 中用 gson 解码 json 字符串?

Django - 在管理 list_display 函数中包含来自外键的数据

django - 从经度/纬度迁移到 GeoDjango Points?

python - 在有两个模型的表单中保存之前设置ForeignKey

java - 无法从服务器获取 JSON 数据