Как создать поле модели Django, которое оценивает на основе других полей? - PullRequest
1 голос
/ 27 сентября 2010

Я постараюсь описать мою проблему на простом примере. Скажем, у меня есть предметы типа Item, и каждый предмет относится к определенному типу Category. Теперь я могу взять любые два предмета и объединить их в комбо типа ItemCombo. Этот предмет относится к определенной категории ComboCategory. Значение ComboCategory основано на том, к каким категориям относятся элементы, поэтому я не хочу жестко кодировать combocategory в ItemCombo в случае изменения категорий элементов. Можно ли как-то сделать combocategory виртуальным полем в ItemCombo, которое оценивается как раз вовремя?

class Category(models.Model):
    value = models.CharField(max_length=1)


class Item(models.Model):
    value    = models.CharField(max_length=10)
    category = models.ForeignKey(Category)


class ComboCategory(models.Model):
    category1 = models.ForeignKey(Category)
    category2 = models.ForeignKey(Category)
    value = models.CharField(max_length=1)


class ItemCombo(models.Model):
    item1         = models.ForeignKey(Item)
    item2         = models.ForeignKey(Item)
    combocategory = models.ForeignKey(ComboCategory)

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Ваши классы моделей являются полными классами Python, поэтому вы можете добавлять к ним атрибуты, методы и свойства:

class ItemCombo(models.Model):
    item1         = models.ForeignKey(Item)
    item2         = models.ForeignKey(Item)

    @property
    def combocategory(self):
        return .. # some mumbo-jumbo of item1 and item2
0 голосов
/ 27 сентября 2010

Проблема в том, что вы можете выполнять запросы только к полям, которые хранятся в базе данных. Теперь вам нужно взглянуть на агрегацию , чтобы как можно быстрее оценить ItemCombo и выполнить фильтрацию по нему.

...