【发布时间】:2009-04-07 18:16:01
【问题描述】:
我有一个类似博客的应用程序,其中包含故事和类别:
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,然后再次保存。最重要的是一些强大的管理器对象可以为我省去麻烦。你有什么推荐的?
【问题讨论】:
标签: python django many-to-many