【发布时间】:2010-12-25 22:35:51
【问题描述】:
我正在开发一个网络应用程序,用户可以在其中创建多个相关元素,然后将这些元素保存到数据库中。 webapp 不知道数据库中的主键是什么,因此它为每个元素分配一个 UUID。这些 UUID 与数据库中的每个元素一起保存。当 web 应用程序将数据发送到 web 服务器以放置在数据库中时,它使用 JSON 对所有内容进行编码。然后 Web 服务器使用 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'
我需要将虚拟字段作为实际字段的原因是因为deserialize 需要实际字段。
【问题讨论】:
标签: django json django-models model