2011-08-14 76 views
2

我想遍歷Django模型中的模型字段,並檢查它們是否爲空字符串,並以編程方式在模型save()方法中用null替換它們。這是因爲一些CharFields需要是唯一的或沒有價值。Django:自動將模型字段中的空字符串設置爲None?

實施例:

class Person(models.Model): 
    name = models.CharField(blank=True, unique=True, null=True) 
    nick_name = models.CharField(blank=True, unique=True, null=True) 
    ... 
    age = models.IntegerField() 

    def save(self, *args, **kwargs): 
     for field in self._meta.fields: # get the model fields 
      if field=='': 
       field = None 
     super(Person, self).save(*args, **kwargs) 

上面抱怨一個creation_counter爲什麼來比較這些值,而不是與空字符串字段值試圖完成它是不清楚的。

這可以手工完成,但我有太多的機型....

有什麼建議?編輯: 感謝大家誰試圖幫助我! :D

似乎對我有用的解決方案由Jazz發佈,但他的代碼未顯示在他的帖子中。這是我的版本,這是基本相同的,但有一個額外的檢查,以確保我們只覆蓋在必要時:

from django.db.models.Field import CharField as _CharField 

class CharField(_CharField): 
    def get_db_prep_value(self, value, *args, **kwargs): 
     if self.blank == self.null == self.unique == True and value == '': 
      value = None 

     return super(CharField).get_db_prep_value(value, *args, **kwargs) 
+0

_meta.fields可能包含的不僅僅是模型字段。你有沒有在個別領域嘗試過這種方法?另外,確切的錯誤信息是什麼? – Ted

回答

6

在你的情況,我建議自定義模型領域,其子類的CharField,並確保一個空字符串被轉換爲None - 覆蓋get_db_prep_value應該這樣做。

class EmptyStringToNoneField(models.CharField): 
    def get_prep_value(self, value): 
     if value == '': 
      return None 
     return value 

class Person(models.Model): 
    name = EmptyStringToNoneField(blank=True, unique=True, null=True) 
    nick_name = EmptyStringToNoneField(blank=True, unique=True, null=True) 

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

+0

這聽起來像是一個很好的解決方案。我將發佈我的代碼作爲答案。編輯:試圖編輯你的文章,我意識到你已經發布了一些在我的瀏覽器中根本沒有顯示的代碼。我會將你的標記作爲答案,但我的代碼會做一些額外的檢查。將被添加到我的文章。 – GoogleDroid

+0

如果您需要URLField的類似功能,但需要verify_exist = True,您會怎麼做?我..沒有URL空驗證所需的空網址?由於表單也涉及到,它會變得有點複雜,並且會進行自己的驗證。 – GoogleDroid

+0

在這種情況下,只需使用'blank = True' ;-)和上面相同的代碼! – jazz

0

爵士的回答就像對我的魅力。

我只想指出,如果您使用的是南遷移工具,那麼schemamigration命令將失敗,除非您爲新的自定義字段指定自述規則

對於「簡單字段」,只需將以下代碼添加到指定字段的任何位置即可。

from south.modelsinspector import add_introspection_rules 
add_introspection_rules([], ["^myapp\.stuff\.fields\.SomeNewField"]) 

現在南遷應該起作用。

僅供參考。

參考:http://south.aeracode.org/wiki/MyFieldsDontWork

相關問題