相关疑难解决方法(0)

为什么django的model.save()不调用full_clean()?

我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.

请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档

(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)

有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.

我知道如何使一切正常工作,我只是在寻找解释.

python django django-models django-validation

141
推荐指数
3
解决办法
2万
查看次数

在指定 update_fields 时使用 pre_save

我在 MyModel 上定义了一个 pre_save ,它看起来像这样:

@receiver(pre_save, sender=MyModel)
def _mymodel_pre_save(sender, instance, **kwargs):
  if some_condition():
    instance.somecolumn = 'eggs'
Run Code Online (Sandbox Code Playgroud)

即它期望能够修改 MyModel 实例的某些属性,并且当然期望这些更改在 save() 调用期间保留。我相信这是 pre_save 函数的典型用法。只要 save() 调用不指定 update_fields ,这就可以正常工作。

我想知道此时是否有任何安全且合理的方法可以在 MyModel 实例的 save() 调用中使用 update_fields 。如果我天真地打电话:

myinstance = MyModel.objects.get(id=100)
myinstance.othercolumn = 'spam'
myinstance.save(update_fields=['othercolumn'])
Run Code Online (Sandbox Code Playgroud)

生成的 UPDATE 语句将如下所示:

UPDATE "myapp_mymodel" SET "othercolumn" = 'spam' WHERE "myapp_mymodel"."id" = 100
Run Code Online (Sandbox Code Playgroud)

缺少预保存中“somecolumn”的预期更新。我想可以通过查看可用于 pre_save 函数(作为冻结集)的 update_fields 从 pre_save 内部检测到这种情况,但我看不到 pre_save 有任何方法可以强制在以下情况下进行预期的更改:调用者有一组更具限制性的 update_fields,如上面的示例所示。或者有什么解决方法吗?

python django django-signals

5
推荐指数
1
解决办法
2525
查看次数