2010-07-06 101 views
0

我有Django的模型,看起來像這樣:數組拆分場

class Categories(models.Model): 
    """ 
    Model for storing the categories 
    """ 
    name = models.CharField(max_length=8) 
    keywords = models.TextField() 
    spamwords = models.TextField() 
    translations = models.TextField() 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     verbose_name = _('Category') 
     verbose_name_plural = _('Categories') 

字段keywordsspamwordstranslations包含逗號分隔文本的大塊。有人能告訴我怎麼能寫的模型,對於特定的字段名,返回值列表內的函數,這樣我可以訪問它是這樣的:

cat = Categories.objects.get(id=1) 
print cat.keywords.to_array() 

...返回現場數據,分割成陣列。 (分裂位是很簡單的,我知道該怎麼做 - string.split(',')

感謝

回答

1

您可以輕鬆地添加一個實例方法您Categories類是這樣的:

class Categories(models.Model): 
    ... rest of your definition ... 

    def get_spamwords_as_list(self): 
     return self.spamwords.split(',') 

你可以使用它像這樣:

cat = Categories.objects.get(id=1) 
print cat.get_spamwords_as_list() 

但是我很好奇你的底層數據模型 - 你爲什麼不使用一個ManyToManyField來建模您的類別?

UPDATE:添加一個可選的通用版本:

def get_word_list(self, name): 
    if name in ['keywords', 'spamwords', 'translations']: 
     return getattr(self, name).split(',') 

# or even 
def __getattr__(self, name): 
    if name[-5:] == '_list' and name[:-5] in ['keywords', 'spamwords', 'translations']: 
     return getattr(self, name[:-5]).split(',') 
    else 
     raise AttributeError 

cat = Categories.get(pk=1) 
cat.get_word_list('keywords') # ['word 1', 'word 2', ...] 
cat.keywords_list    # ['word 1', 'word 2', ...] with 2nd approach 
cat.keywords     # 'word 1, word 2' -- remains CSV 
+0

你的方法是,突然出現在我腦海中的第一個,但我不知道是否可以爲字段創建通用函數,而不是爲字段創建三個不同的函數。 如果您問我爲什麼要將數據存儲爲CSV - 這是因爲網站管理員經常從本地文本文件複製粘貼CSV數據。這種方法似乎比單獨輸入單詞要容易得多。 :) – 2010-07-06 16:24:04

+0

明白了 - 不明白你在尋找一個通用函數;我認爲你很優雅。根據您的需求,您仍然可以接受CSV輸入,並編寫接受CSV並將其轉換爲M2M關係的自定義表單小部件 - 但我相信您知道自己需要實施的內容。 – Benj 2010-07-06 17:15:51

+0

用你的方法(重載__getattribute__),你​​如何得到* unsplit *值,例如在django admin或任何你想要CSV文本的地方編輯時?我猜你可以做'',.join(cat.keywords)'但看起來...... 通用 def get_word_list(self,name): 如果['keywords','spamwords' ,'翻譯']: return getattr(self,name).split(',') ? – Benj 2010-07-06 20:24:47

0

我就是這麼做的:

class Categories(models.Model): 
    """ 
    Model for storing the categories 
    """ 
    name = models.CharField(max_length=8) 
    keywords = models.TextField() 
    spamwords = models.TextField() 
    translations = models.TextField() 

    def __unicode__(self): 
     return self.name 

    def __getattribute__(self, name): 
     if name not in ['keywords', 'spamwords', 'translations']: 
      return object.__getattribute__(self, name) 
     else: 
      return object.__getattribute__(self, name).split(',') 

    class Meta: 
     verbose_name = _('Category') 
     verbose_name_plural = _('Categories')