【问题标题】:Is Django has something like "database middleware"?Django 有类似“数据库中间件”的东西吗?
【发布时间】:2015-05-05 13:52:05
【问题描述】:

Django 有中间件来实现请求和响应时的操作。 Django是否有“数据库中间件”来实现写入数据和读取数据时做某事。

例如,一些旧的数据库不支持 utf8mb4 ,所以它不能支持所有的表情符号。如果 Django 有“数据库中间件”,我会在保存时对数据进行编码,在读取时进行解码。

【问题讨论】:

  • 我不回答你的问题,但也许我可以用另一种方法帮助你。即将推出的 django utf8mb4 encoding with MySQL 5.5 中有一个新功能。与此同时,那里的人们目前正在讨论另一种解决方案。 :)
  • 您应该查看django signals。您可以从任何数据库模型调用保存前和保存后的函数,本质上是一个中间件。
  • 如果你真的想更深入地实现这个解决方案,也许你可以深入研究他们如何实现DB backend的源代码
  • 如果您已经精通 Django,也许这可能会有所帮助。 James Bennett Django in Depth。振作起来,这是 3 小时,但您只需要观看接下来的 1 小时即可解决您的问题。
  • @Yeo 非常感谢~ 可惜我觉得我在 Django 方面做得不好。也许我会在不久的将来阅读它。

标签: python django database middleware django-middleware


【解决方案1】:

您可以通过overwrite model methods 专门的保存方法来实现这一点。

来自文档的示例 从 django.db 导入模型

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        # your intended modification
        do_something()
        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()

还要检查 pre_savepost_save 模型信号。

【讨论】:

  • decode 是数据库中的read 时,不涵盖它。
  • @Yeo Django 模型描述符是解决这个问题的好人选。 Good explanation here
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 2021-08-04
  • 2012-05-31
  • 2012-11-27
  • 2017-11-21
相关资源
最近更新 更多