我有一个有max_length分的场地.当我保存一个模型实例,并且字段的值大于max_length时,Django在数据库级别强制执行该max_length.(请参阅型号:http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.CharField.max_length上的Django文档)

然而,由于我使用Postgres,我收到了如下DatabaseError个例外:

DatabaseError: value too long for type character varying(1000)

我更喜欢自动截断值(所以我没有异常).现在,我可以手动完成此操作,但我真正想要的是让我的所有模型自动截断该值.(不一定是智能的.(只需在第999个字符处将其删掉即可.)

我是否应该编写一个从模型导入的自定义类.建模并重写save()方法,循环遍历每个_meta.字段,判断最大长度,然后截断?这似乎不雅,一定有更好的办法.

推荐答案

您可以创建一个自定义字段来自动截断该字段(我认为这段代码应该可以工作,但请仔细判断):

class TruncatingCharField(models.CharField):
    def get_prep_value(self, value):
        value = super(TruncatingCharField,self).get_prep_value(value)
        if value:
            return value[:self.max_length]
        return value

然后,您只需使用TruncatingCharField,而不是在models.py文件中使用models.CharField.

get_prep_value准备在数据库中插入的字段的值,因此它是截断的理想位置.

Django相关问答推荐

其中实际的数据库提取在DRF list()中完成

Django中的Sync_to_Async修饰器、异步视图

SQLite上可以正常使用Many2Many链接注释,但MariaDB上无法正常使用(生产环境)

在Django测试get方法中获取HttpResponseNotFound

CsrfViewMiddleware 和 enforce_csrf 有什么区别?

Django 关系嵌套related_name

如何在没有此前缀的情况下修复此 django 路径?

何时在 django 中使用 pre_save、save、post_save?

如何在 django tests.py 中创建管理员用户

如何访问 Django Rest Framework 上的自定义 HTTP 请求标头?

如何从不是 django 元素文件夹的文件夹中运行 gunicorn

有没有办法将变量传递给 Django 中的 extended模板?

在 Django 中,您可以向查询集添加方法吗?

如何在 django 模板中将名称反转为绝对 url?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

Apache + mod_wsgi 与 nginx + gunicorn

URL命名空间的一个真实例子

在 Django 中使用 Cython,是否有意义?

将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

Django - 保存新对象时如何获取 self.id?