簡體   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