我正在开发一个网络应用程序,用户可以在其中创建多个相关元素,然后将这些元素保存到数据库中。 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。我不想在数据库中保存 sourceuuid
和 targetuuid
,因为保存整数的空间要少得多,而且索引也应该更快。
所以,我正在寻找的是一个临时字段。我可以实例化和引用的一个,但永远不会保存回数据库。关于如何创建这样的东西有什么想法吗?
更新更多说明
感谢到目前为止的帮助,我知道它们是 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/