我的模型类别中有3个字段,主要和辅助。 和2种选择属性和类别。现在我希望自动添加主要内容,具体取决于CATEGORIES选项的值。 我的模型选择和字段
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)
然后获取Skill object.category
的方法def get_primary(category):
if category == 'Archery':
return ATTRIBUTES[1]
问题是我不知道如何使用我获得表单选择的数据,以及如何发回一个选项以保存在对象中。 有人可以帮帮我吗? 电贺 汉斯
答案 0 :(得分: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
答案 1 :(得分: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]))
答案 2 :(得分: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)