我正在开发一个Web应用程序,用户可以在其中创建多个相关元素,然后将这些元素保存到数据库。 Web应用程序不知道数据库中的主键是什么,因此它为每个元素分配一个UUID。这些UUID与数据库中的每个元素一起保存。当Web应用程序将数据发送到Web服务器以放入数据库时,它会使用JSON对所有内容进行编码。 JSON然后由网络服务器使用serializers.deserialize('json', DATA)
进行反序列化。但是,某些模型具有外键,这些外键在JSON有效内容中发送,作为对关联元素的UUID的引用而不是数据库ID。例如,我们可具有一个简单的链接对象:如何在Django的模型中添加临时字段?
class Link(models.Model):
uuid = models.CharField(max_length=32)
source = models.ForeignKey(Node, related_name='source')
target = models.ForeignKey(Node, related_name='target')
如果源有值的2的ID和目标具有值12的ID,这将被序列化到JSON作为这样的:
{"uuid": "[some long uuid]",
"source": 2,
"target": 12}
然而,因为在这种情况下,我们不知道的源和目标的数据库ID,可能是因为他们尚未设置,我所能做的最好的是通过在UUID是这样的:
{"uuid": "[some long uuid]",
"sourceuuid": "[uuid of source]",
"targetuuid": "[uuid of target]"}
不幸的是,th当我拨打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模型的ForeignKey仍然在引用表中添加一列。但是,如果我使用'sourceuuid'和'targetuuid'作为新字段创建一个完整的非物化子类,我可以到某处。我在一个新的'LinkJSON'类中反序列化,然后映射UUID,然后将这些字段复制到'Link'类。它不漂亮,但它有点不错。如果Python有一个简单的方法将类型转换为基类,那将会更好。 – Pridkett 2009-12-12 14:50:07
我接受这个答案,因为它最接近我想要做的。我不得不做一些时髦的子类化,然后创建一个JSONSerializer的子类来处理所有事情,但它现在起作用了。不幸的是,它成为一个非常具体的解决方案,所以我不能将它的全部内容发布到StackOverflow。 – Pridkett 2010-01-04 19:48:05