【问题标题】:max_length does not work最大长度不起作用
【发布时间】:2017-12-20 12:48:48
【问题描述】:

我的模型中有这样的字段:

name = models.CharField(max_length=20, default='Anonymous')

但是当我在该字段中输入更多字符时,没有错误,我可以输入任意数量的字符。我可以在我看来,在 admin/ 中做,反正没有错误。 有人建议我在保存条目之前制作 .full_clean() ,但这并不影响,该字段仍然允许输入超过 20 个字符。与其他字段相同。

我非常非常非常抱歉我的英语不好。

更新: 我的models.py的完整代码:

    from django.db import models
from django.core.files.storage import FileSystemStorage
import imgboard.const as c

fs = FileSystemStorage(location='/static/img')


class Board(models.Model):
    addr = models.CharField(max_length=5, primary_key=True)
    # Short description to be displayed on index page
    description = models.CharField(max_length=20, verbose_name="Short description")
    # Is namefags allowed in this thread
    names_allowed = models.BooleanField(default=False, verbose_name="Custom names is allowed")
    default_name = models.CharField(max_length=20, default='Anonymous')
    # Description to be displayed in header of board page
    verbose_description = models.CharField(max_length=400, default='')
    # Allowed extensions of files that can be uploaded to this board
    allowed_extensions = models.CharField(max_length=1024, default=c.ALLOWED_EXTENSIONS)
    # Number of a thread, that will be pinned to top.
    pinned_thread_id = models.IntegerField(default=-1)
    # Is threads w/o pic allowed
    file_required = models.BooleanField(default=False, verbose_name="File is required")

    def __str__(self):
        return '/'+self.addr+'/ - '+self.description

    class Meta:
        ordering = ['addr']


class Thread(models.Model):
    board = models.ForeignKey(Board, db_column='addr', on_delete=models.CASCADE)
    name = models.CharField(max_length=20, default='Anonymous')
    last_msg_date = models.DateTimeField(verbose_name='Time of last message published in this thread',
                                         auto_now_add=True)
    pic = models.CharField(max_length=3000, default='')
    pub_date = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=5000)
    sage_counter = models.IntegerField(default=0)
    bumps = models.IntegerField(default=1)

    def __str__(self):
        return self.text

    class Meta:
        ordering = ['-last_msg_date']


class Message(models.Model):
    thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
    name = models.CharField(max_length=20, default='Anonymous')
    pic = models.CharField(max_length=3000, default='')
    text = models.CharField(max_length=5000)
    pub_date = models.DateTimeField(auto_now=True)
    # OP-post mark displays, that this message was written by thread creator
    op_post = models.BooleanField(default=False)
    # Sage mark displays, that thread will not be bumped by this message
    sage = models.BooleanField(default=False)

    def __str__(self):
        return self.text

    class Meta:
        ordering = ['-pub_date']

迁移运行了很多次,因为我很久以前写了“max_length”,但现在才注意到这个错误。 关于 DB 模式,听说 sqlite 根本不限制 VARCHAR,max_length 仅适用于 Django 后端。

【问题讨论】:

  • 肯定还有另一种导致问题的代码和平。如果相关,请发布您模型的其他部分。如果没有,请尝试检查您的 DB 架构是否具有最大长度(例如,如果您是 Postgres,请在 pgadmin 中查看)。
  • 你在更改字段后运行迁移了吗???
  • 我们需要您发布更多上下文,例如您是否进行了迁移或使用 django 表单,以便我们为您提供帮助

标签: python django


【解决方案1】:

并非所有数据库都具有限制字符串长度等功能。在这种特殊情况下,我使用的 SQLite 没有。 因此,max_length 仅在使用其他数据库(例如 PostgreSQL)时才有效。

如果您需要在 Django 中限制字段长度,请考虑使用字段的 validators 关键字参数来定义验证器,该验证器将检查传递的字符串是否太长,如果是则引发 ValidationException。

另外,SQLite 通常不适合生产环境,所以如果您只在开发阶段使用它,请考虑在测试环境中使用您在生产环境中使用的实际数据库。正是因为这样的差异:您可能认为您的项目一切正常,但由于这种情况而在生产中遇到错误。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多