2015-02-08 27 views
1

Django-EnumFields可以让你结合Django中的Enum字段(线索在标题中)。如何在Django中组合/嵌套EnumFields?

你能结合这些巢吗?

下面是扮演过一个例子docs

from django.db import models 
from django_enumfield import enum 

class BeerStyle(enum.Enum): 
    LAGER = 0 
    STOUT = 1 
    WEISSBIER = 2 

class SoftDrinkStyle(enum.Enum): 
    COKE = 3 
    LEMONADE = 4 

class Drink(models.Model): 
    style = enum.EnumField(????, default=BeerStyle.LAGER) 

我不知道是什么会去代替????,或是否有更好的方式来获得与此嵌套/组合发挥出Django的。我主要想问我是否需要Enum行为,并具有探测不同类型的能力,例如在保存方法中,如果饮料是或者输入Beer,则检查User年龄。

这可能吗?玩了这一点,我没有看到如何。

+0

如果“饮料”需要年龄限制和其他行为,为什么不使用模型呢? Enum似乎不是在这里使用的正确工具。 – 2015-02-08 22:40:21

+0

@HåkenLid,因为我给出的例子实际上并不是我所拥有的很好的表示。我确信我想在我的例子中使用枚举,因为它提供的选择永远不会改变或增长。 – Pureferret 2015-02-09 08:01:05

回答

2

说完看着对Python枚举是如何工作的,这看起来像最好的行为来模仿“子”

from django.db import models 
from django_enumfield import enum 

class DrinkStyle(enum.Enum): 
    LAGER = (0, 'Beer') 
    STOUT = (1, 'Beer') 
    WEISSBIER = (2, 'Beer') 
    COKE = (3, 'SoftDrink') 
    LEMONADE = (4, 'SoftDrink') 

    def __init__(self, id, drink_type): 
     self.id = id  
     self.type = drink_type 

    @property 
    def type(self): 
     return self.drink_type 

class Drink(models.Model): 
    style = enum.EnumField(DrinkStyle, default=DrinkStyle.LAGER) 

然后使用DrinkStyle.COKE.type返回类型。

+0

原来,这并不适用于我拥有的图书馆。总的想法很有效,但实施会更加混乱。 – Pureferret 2015-02-09 19:11:36

+0

你使用过哪个库@pureferret – Dejell 2016-09-12 11:59:15

+0

@dejell我没有到最后。 – Pureferret 2016-09-12 12:37:08