2013-12-21 13 views
1

У меня есть 3 поля в моей модели, первичной и вторичной. и 2 варианта АТРИБУТЫ И КАТЕГОРИИ. теперь я хочу, чтобы основной был добавлен автоматически в зависимости от значения выбора КАТЕГОРИЙ. Моя модель выбора и поляdjango если значение выбора возвращаемое значение другого выбора

class Skill(models.Model): 
    ATTRIBUTES = (
     ('STR', 'Strength'), 
     ('DEX', 'Dexterity'), 
     ('CON', 'Constitution'), 
    ) 
    CATEGORIES = (   #Primary attribute = 
     ('ARCH', 'Archery'), # Dexterity 
     ('ARMO', 'Armor'), # Constitution 
     ('CRAF', 'Crafting'), # Strenght 
     ('ELIX', 'Elixers'), # Constitution 
    ) 
    primary = models.CharField(max_length=3, choices=ATTRIBUTES) #added automatic 
    secundary = models.CharField(max_length=3, choices=ATTRIBUTES) 
    category = models.CharField(max_length=4, choices=CATEGORIES) 

И тогда метод, который получает навык object.category

def get_primary(category): 
    if category == 'Archery': 
     return ATTRIBUTES[1] 

Проблема в том, я не уверен, как я могу играть с данными, я получаю выбор формы, и как чтобы отправить обратно выбор для сохранения в объекте. Может кто-нибудь, пожалуйста, помогите мне здесь? Greets Hans списки

ответ

0

Вы можете сделать отображение Dict с объединением категорий и атрибутов (если я правильно Вас понял):

attr_map = { 
    'ARCH': 'DEX' # Archery -> Dextrerity 
} 

и использовать его в функции:

def get_primary(): 
    #if category == 'Archery': 
    # return ATTRIBUTES[1] 
    return attr_map[self.category] 

    # or choice tuple if you need it 
    return (attr_map[self.category], 
      dict(self.ATTRIBUTES).get(attr_map[self.category])) 
+0

goign, чтобы попробовать это, чувствует себя с количеством категорий навыков, которые у меня есть, использование словаря должно быть лучше. –

+0

http://pastebin.com/Ku2p7ZnP это похоже на работу –

1

Перечислительных как ваш ATTRIBUTES, CATEGORIES списки ('value', 'verbose_name') кортежей. value записывается в БД, а verbose_name отображается пользователю. Итак, чтобы проверить, какая категория назначена экземпляру, вы должны использовать 'value', например. category == 'ARCH'.

Вы можете обратиться к списку перечислений, используя класс, например. Skill.ATTRIBUTES. Если вы хотите назначить выбор, вы должны использовать 'value'. Вы можете просто установить его, назначив строку, например, self.secondary = 'ELIX' или получив строку из перечисления, например, self.secondary = Skill.ATTRIBUTES[-1][0].

Самый лучший способ для определения констант и использовать их везде, как это:

ARCHERY = 'ARCH' 
ARMOR = 'ARMO' 

DEX = 'DEX' 

class Skill(models.Model): 
    CATEGORIES = (
     (ARCHERY, 'Archery'), 
     (ARMOR, 'Armor'), 
     ... 
    ) 
    ... 

def get_primary(self): 
    if category == ARCHERY: 
     return DEX 
+0

ОК, я собираюсь попробовать это, я думаю, для возврата, мне нужно также вернуть значение? –

+0

Я думаю, это также может работать, я работаю с django и can not store 3 значения в моих вариантах. по моему мнению, словарь более изящный. спасибо за помощь tho –

0

Если у вас есть много категорий или может добавить ок теги позже, используя подходящую модель Category, было бы, возможно, лучшим решением. Это также позволило бы вам легче классифицировать категории по основному навыку:

ATTRIBUTES = (
    ('STR', 'Strength'), 
    ('DEX', 'Dexterity'), 
    ('CON', 'Constitution'), 
) 

class Category(models.Model): 
    name = models.CharField("name", max_length=32) 
    primary = models.CharField("primary", max_length=3, choices=ATTRIBUTES) 

class Skill(models.Model): 
    category = models.ForeignKey(Categorie) 
    @property 
    def primary(self): 
     return self.category.primary 
    secundary = models.CharField(max_length=3, choices=ATTRIBUTES) 
+0

Не получайте категории mroe, то есть те, которые у меня есть, но все же я думаю, что мне тоже нравится это решение. –

+0

Просто будьте осторожны, это будет немного тяжелее SQL запросов, чем ваш текущий проект ... Вероятно, вы захотите использовать 'select_related (" category ")' предложения в своих запросах, чтобы избежать проблемы с запросами N + 1. –

Смежные вопросы