繁体   English   中英

Django - 用 CharField 上的空字符串替换 None - 最佳实践

[英]Django - Replace None by an empty string on the CharField - best practices

我决定检查我的 Django 应用程序,发现我的模型存在一些问题。

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

我正在阅读 Django 中的最佳实践,我刚刚发现我做的一切都是错误的。 这里的很多帖子解释说我们不应该同时在 CharField 上使用 blank 和 null 选项。 为了遵循规则,我删除了 null=True 并只保留 blank=True

我的疑问来了:我正在从 web 抓取代码填充我的数据库。 有时 CharField 选项从网站返回为 None 并且当我的代码试图将它发送到数据库时(我不是在表单中这样做)我收到无效格式错误告诉我我不应该使用 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 function 是否在所有字符串字段上使用 strip()? 由于我从 full_clean 中排除了我的 CharFields,我应该在干净的 function 上使用条带吗?

谢谢你们,伙计们!

您的解决方法对我来说看起来不太干净,感觉太过骇人听闻且错误。

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

无论如何, clean方法用于验证数据,而不是转换数据。 因此,如果您将验证设置为禁止字段中的 null 值,那么为什么要传递 null 数据? 如果你确实想禁止存储 null 数据,那么正确的方法是将你的抓取器接收到的 null 值转换为空字符串,然后再将它传递给你的 model。这将消除使用验证器实施肮脏变通方法的需要。

full_clean function 是否在所有字符串字段上使用 strip()?

它没有。 它只执行验证。 所以如果你想在将它们保存到数据库之前去除你的刺,那么你应该手动stip它们,否则不要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM