我有一个类似博客的应用程序,其中包含故事和类别:
class Category(models.Model):
...
class Story(models.Model):
categories = models.ManyToManyField(Category)
...
现在我知道,当您保存具有多对多字段的模型的新实例时,会出现问题,因为该对象尚未在数据库中。这个问题通常表现在表单提交上,可以巧妙地使用story_form.save(commit=False)
. 没有形式可言的情况呢?就我而言,我想构建一个 API 来接受远程提交。由于我喜欢 JSON,而且我们公司的许多其他消息都是 JSON 格式(包括来自该服务器的传出消息),我希望能够接收以下内容:
{ "operation": "INSERT",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
并实现一个将值转换为实例的工厂。但我希望工厂对操作类型尽可能不可知。所以:
{ "operation": "UPDATE",
"values": [
{ "datatype": "story",
"categories": [4,6,8],
"id":50,
...
}
]
}
也应该以相同的方式转换,除了 INSERT 忽略 id 并且 UPDATE 获取已经存在的实例并覆盖它。(远程提交者侦听一个提要,除其他外,它还提供要缓存的类别对象,因此它可以而且必须通过 id 引用它们,但它与数据库没有任何直接通信。)
我真正的问题是:对涉及 ManyToManyManager 的 Django 模型对象的实例进行膨胀最简单的方法是什么。据我所知,任何插入具有多对多字段的对象都需要两次数据库命中,因为必须首先获得一个新的 id。但我目前尴尬的解决方案是立即保存对象并将其标记为隐藏,以便后续功能可以使用它并将其保存为更有意义的东西。似乎上一步将被覆盖save
,以便没有 id 的对象保存一次,将一些代理字段复制到categories
,然后再次保存。最重要的是一些强大的管理器对象可以为我省去麻烦。你有什么建议吗?