【问题标题】:Django - Replace None by an empty string on the CharField - best practicesDjango - 在 CharField 上用空字符串替换 None - 最佳实践
【发布时间】:2020-10-10 04:05:13
【问题描述】:

我决定审查我的 Django 应用程序,并在我的模型中发现了一些问题。

我的问题与 CharField 空白和空选项有关。

我正在阅读有关 Django 的最佳实践的信息,但我刚刚发现我做错了所有事情。这里的许多帖子都解释了我们不应该同时在 CharField 上使用空白和空选项。为了遵守规则,我删除了 null=True 并只保留了空白=True

这是我的疑问:我正在从网络抓取代码填充我的数据库。有时 CharField 选项从网站返回为 None 并且当我的代码尝试将其发送到数据库时(我没有在 Forms 中这样做)我收到 Invalid Format 错误,告诉我我不应该使用 None - 因为我拿了null=True。

我已经阅读了一些关于它的资料并想出了一个解决方案,我在此展示它以听取你们的意见,男孩/女孩。这是最好的方法吗?对于这种非常常见的情况,我觉得 Django 可能有一些开箱即用的东西。

class Empresa(models.Model):
    #I've chosen just some fields to keep it simple

    userstelegram = models.ManyToManyField(UserTelegram, blank=True)
    nome = models.CharField(max_length=150, blank=True)
    denominacao_social = models.CharField(max_length=150, blank=True)
    setor_atividade = models.CharField(max_length=150, blank=True)
    categoria_registro = models.CharField(max_length=100, blank=True)
    cnpj = models.CharField(max_length=100, blank=True)
    coberta = models.BooleanField(default=True)

    def save(self, *args, **kwargs):
        self.full_clean(
            exclude = [
                'nome',
                'denominacao_social', 
                'setor_atividade',
                'categoria_registro',
                'cnpj',
            ]
        ) # performs regular validation then clean()

        super(Empresa, self).save(*args, **kwargs)

    def clean(self):
        
        self.cnpj = str(self.cnpj or '').strip()
        self.categoria_registro = str(self.categoria_registro or '').strip()
        self.setor_atividade = str(self.setor_atividade or '').strip()
        self.denominacao_social = str(self.denominacao_social or '').strip()
        self.nome = str(self.nome or '').strip()

    def __str__(self):
        return self.nome if self.nome != None else self.denominacao_social

两个额外的问题:

1 - 我将 self.full_clean() 与 exclude 参数一起使用,因此验证器不会在带有 None 的 CharField 上触发错误。这是正确的方法吗?

2 - full_clean 函数是否在所有字符串字段上使用 strip()?由于我从 full_clean 中排除了我的 CharFields,我应该在 clean 函数上使用条带吗?

谢谢各位!

【问题讨论】:

    标签: python django validation


    【解决方案1】:

    您的解决方法在我看来并不干净,感觉太老套和错误。

    我不知道您从哪里读到同时设置 null=True 和 blank=True 是个坏主意。我认为这没有一般规则,您应该从您想要实现的目标以及在您的特定情况下对您最方便的目标出发。如果您并不真正关心您的某些 char 字段是否可能为 null 并且其中一些可能为空白,并且您的代码可以很好地处理这两种情况,那么也许没有理由删除 null=True 设置?似乎该决定给您带来了一些麻烦,并使您的代码不那么干净。

    无论如何,clean 方法是用于验证数据,而不是转换它。因此,如果您将验证设置为禁止字段中的空值,为什么还要传递空数据? 如果您确实想禁止存储空数据,那么正确的方法是将您的刮板接收到的空值转换为空字符串您将其传递给您的模型。这将消除对验证器实施肮脏变通办法的需要。

    full_clean 函数是否对所有字符串字段使用 strip()?

    它没有。它只执行验证。因此,如果您想在将它们保存到数据库之前将它们剥离,那么您应该手动 stip 它们,否则不要。

    【讨论】:

    • 感谢您的回答。好吧,我读过在 CharField 中使用空白和 null 作为 true 有点多余,并迫使您拥有两种类型的“不存在”变量。这种逻辑对我来说听起来很合适。但我确实喜欢你的解释。在我的模型中执行转换是一个坏主意吗?我只是想确保如果抓取请求中出现问题,我不会出错。在我看来,转换它而不是在刮刀上处理它要容易得多......谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2011-01-10
    • 2010-11-10
    相关资源
    最近更新 更多