2013-12-07 121 views
1

我目前正试图在Django中实现状态模式。把这些模型例如:状态模式 - Django模型

class Restaurant(models.Model): 
    name = models.CharField() 
    # other fields here ... 


class State(models.Model): 
    pass 

class StateOpen(State): 
    def toggle_open_closed(): 
     pass 

class StateClosed(State): 
    def toggle_open_closed(): 
     pass 

现在怎么可以让我的餐厅有一个状态,这个状态可以是一个StateOpen或StateClosed?

编辑:理想情况下我希望能够做这样的事情:

r = Restaurant(name='whatever') 
r.state.doSomething() 

# doSomething() being a function that each state child class has, 
# but implemented differently 

回答

1

不要创建状态模型,如果联署只能是两个“开放”和“封闭”,可以使状态字段在Restaurant型号:

class Restaurant(models.Model): 
    name = models.CharField() 
    state = models.BooleanField(default=False) 

    def toggle_open_closed(self): 
     self.state = not self.state 
     self.save() 

您还可以定义指出我们模型状态的预定义列表和IntegerField

RESTARAUNT_STATE = (
    (0, 'Open'), 
    (1, 'Closed'), 
    (2, 'Didnt decided yet, come here later!'), 

    # you can define more states later 
) 

class Restaurant(models.Model): 
    name = models.CharField() 
    state = models.IntegerField(choices=RESTARAUNT_STATE) 

如果你真的需要单独的模型为状态,你当然可以,但toggle_state函数必须在Restaraunt模型。

class State(models.Model): 
    name_of_state = models.CharField() 

class Restaurant(models.Model): 
    name = models.CharField() 
    state = models.ForeignKey(State) 

    def toggle_state(self): 
     self.state = State.objects.get(...) 
     self.save() 
+0

如果我希望我的状态有不同的行为呢?我正在寻找一些simalar,但使用模型:https://github.com/faif/python-patterns/blob/master/state.py – XuoriG