2013-12-21 62 views
1

我的模型类别中有3个字段,主要和secundary。 和2个选择属性和CATEGORIES。现在我希望主要根据CATEGORIES选项的值自动添加。 我的模型的选择和领域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] 

问题是IM不知道如何与数据我得到形式的选择,以及如何发挥方法发回要保存在对象中的选项。 有人可以帮我在这里吗? 电贺 汉斯

回答

0

你可以用类别的关联映射字典和属性(如果我没有理解你的权利):

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

枚举列表像你ATTRIBUTESCATEGORIES('value', 'verbose_name')元组列表。将value写入数据库,并将verbose_name显示给用户。因此,要检查分配给该实例的类别,必须使用'value',例如category == 'ARCH'

您可以使用class来引用枚举列表,例如, 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一起工作,并不能在我的选择中存储3个值。字典在我看来更加优雅。感谢您的帮助tho –

0

如果你有很多的类或添加CA后来,使用合适的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查询问题。 –

相关问题