gpt4 book ai didi

python - 在 Django 中使用 ManyToMany 插入对象

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:21 25 4
gpt4 key购买 nike

我有一个类似博客的应用程序,其中包含故事和类别:

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,然后再次保存。最好的是一些健壮的管理器对象,它可以帮我省去麻烦。你有什么建议?

最佳答案

“据我所知,任何插入具有多对多字段的对象都需要两次数据库命中,...”

那又怎样?

微观管理每个单独的数据库访问通常是不值得考虑的。做最简单、最明显的事情,以便 Django 可以为您优化缓存。

您的应用程序性能 - 通常 - 由缓慢下载到浏览器以及页面中的所有 JPEGS、CSS 和其他静态内容决定。

花时间绞尽脑汁思考如何在不进行两次数据库访问的情况下制作两个主键(用于多对多关系)不会得到很好的返回。两次 PK 通常是两次数据库访问。


编辑

“...乱扔错误的数据库...”

Django 有事务。参见 http://docs.djangoproject.com/en/dev/topics/db/transactions/#managing-database-transactions .使用 @transaction.commit_manually 装饰器。

“强制稍后发生的验证”

没有意义 - 更新您的问题以对此进行解释。

关于python - 在 Django 中使用 ManyToMany 插入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com