Skip to main content
 首页 » 编程设计

python之状态模式之Django 模型

2025年05月04日23Free-Thinker

我目前正在尝试在 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 

请您参考如下方法:

如果状态只能是'open'和'closed'两个,不要为状态创建模型,你可以在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 函数必须在 Resaraunt 模型中。

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()