为啥像Django这样的框架会很火

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥像Django这样的框架会很火相关的知识,希望对你有一定的参考价值。

参考技术A 1、Django一个高效的web框架,以最小代码构建和维护高质量web应用; 2、Django减少重复代码,专注于Web应用上关键的东西 以上两点就是他的优势所在

为啥不能像这样更新 django 模型实例:instance(**update_dict)?

【中文标题】为啥不能像这样更新 django 模型实例:instance(**update_dict)?【英文标题】:Why is it not possible to update a django model instance like this: instance(**update_dict)?为什么不能像这样更新 django 模型实例:instance(**update_dict)? 【发布时间】:2021-07-18 20:28:16 【问题描述】:

我可以使用Model(**dictionary) 创建一个新的 django 模型对象,但如果我想以相同的方式更新一个实例,我发现只有 update_or_create 存在问题并且经常返回“重复 PK”错误。在模型对象上调用自定义辅助函数似乎也不是特别pythonic。或者,您可以使用以下模式:

 Model.objects.get(id=id).update(**dict)

model.__dict__.update(**dict)
model.save()

后者感觉像是一个 hack,我读了几次,它不“应该”以这种方式完成。第一种方法需要查询调用,并且再次感觉不正确,因为模型实例可能已经实例化并且要更新它,我们需要再次向数据库发送查询?

我还读到“您可以使用表单来执行此操作” - 但并不总是用户在更新数据库中的模型,我们可能会编写各种需要更新模型的函数。我想知道,是否有以下代码不可能/实现的原因?模型对象不能以这种方式直接调用和更新是否有原因?

model_instance(**dict)
model_instance.save()

【问题讨论】:

【参考方案1】:

没有任何内置功能可以通过输入关键字参数来更新模型实例中的字段值。

以下查询将立即更新数据库行,并具有额外的缺点,即它不会调用您可能已注册到模型的任何保存前或保存后信号:

Model.objects.get(id=id).update(**dict)

关于为什么这不起作用:

model_instance(**dict)

实例对象通常不可调用。类对象(实例化实例对象)和传递给它们的可调用对象的 kwargs 在它们的 __init__ 方法中进行评估。例如,当你创建一个dictmydict = dict()时,你不能通过调用mydict(**kwargs)来更新它。

不过,您可以创建自己的模型方法。例如,您可以创建一个 abstract base class,您的所有模型都继承自(而不是从 models.Model),例如

class ModelWithUpdate(models.Model):

    class Meta:
        abstract = True

    def update(self, commit=False, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
        if commit:
            self.save()

然后你的用法是:

model_instance.update(**dict)
model_instance.save()

# or a shortcut
model_instance.update(commit=True, **dict)

【讨论】:

【参考方案2】:

只是:

Model.objects.filter(id=id).update(**kwargs)

【讨论】:

以上是关于为啥像Django这样的框架会很火的主要内容,如果未能解决你的问题,请参考以下文章

像Django的模板框架/ Jinja这样的前端框架[关闭]

为啥 Django 模板循环嵌套了我的 div?

为啥coverage.py 不能正确测量Django 的runserver 命令?

为啥 Django 不退出会话? .get 函数也不再像 .all 函数那样亮起?数据库中没有显示任何内容

30Python之web框架django进阶篇

django框架开发流程