这个场景很简单:
我有一个模型,其中包含一些必填字段.让我们说其中一个是TextField不可能的blank.我还有一个ModelSerializer代表该模型的(Django Rest Framework).
当使用空字符串通过序列化程序设置该字段时,返回的错误来自模型本身(This field can't be blank).
我想只在序列化程序级别覆盖错误消息,而不需要显式地重新指定序列化程序中的每个字段(我认为这是违反DRY原则),必须validate_为每个字段编写一个方法并提高我自己的ValidationError或者必须更改Model级别中的错误消息(因为有时错误消息的上下文对我的用例很重要,因此应该给出错误消息).
换句话说,有没有办法在序列化程序级别覆盖错误消息,就像它对于ModelForm:
class MyModelForm(ModelForm):
class Meta:
model = MyModel
error_messages = {"field1": {"required": _("For some reason this is a custom error message overriding the model's default")}}
Run Code Online (Sandbox Code Playgroud) 我想在我的一个模型中更改一个外键,该模型当前具有NULL值,不能为空.
我null=True从我的字段中删除并运行makemigrations
因为我正在改变一个已经包含该字段中包含NULL值的行的表,所以我被要求立即提供一次性值或编辑迁移文件并添加RunPython操作.
我的RunPython操作在AlterField操作之前列出,并对此字段执行所需的更新,因此它不包含NULL值(仅包含已包含NULL值的行).
但是,迁移仍然失败并出现此错误:
django.db.utils.OperationalError: cannot ALTER TABLE "my_app_site" because it has pending trigger events
这是我的代码:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def add_default_template(apps, schema_editor):
Template = apps.get_model("my_app", "Template")
Site = apps.get_model("my_app", "Site")
accept_reject_template = Template.objects.get(name="Accept/Reject")
Site.objects.filter(template=None).update(template=accept_reject_template)
class Migration(migrations.Migration):
dependencies = [
('my_app', '0021_auto_20150210_1008'),
]
operations = [
migrations.RunPython(add_default_template),
migrations.AlterField(
model_name='site',
name='template',
field=models.ForeignKey(to='my_app.Template'),
preserve_default=False,
),
]
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,当字段被更改为不可为空但字段包含空值时,可能会发生此错误.在这种情况下,我能想到为什么会发生这种情况的唯一原因是因为RunPython操作事务在运行之前没有"提交"数据库中的更改AlterField.
如果这确实是原因 - 我如何确保更改反映在数据库中?如果不是 …