Разделить поле на массив при доступе - PullRequest
0 голосов
/ 06 июля 2010

У меня есть модель 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')

Поля keywords, spamwords и translations содержат огромные куски текста, разделенного запятыми. Может кто-нибудь сказать, как я мог бы написать функцию внутри модели, которая для определенного имени поля возвращает значение списка, чтобы я мог получить к нему что-то подобное:

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

... возвращает данные поля, разбитые на массив. (Бит расщепления очень прост, и я знаю, как это сделать - string.split(',')

Спасибо

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Вы можете легко добавить метод экземпляра в свой класс 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 для моделирования своих категорий?

ОБНОВЛЕНИЕ : добавление альтернативной универсальной версии:

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 голосов
/ 06 июля 2010

Я сделал это так:

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')
...