【问题标题】:State Pattern - Django models状态模式 - Django 模型
【发布时间】:2013-12-07 21:25:16
【问题描述】:

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

【问题讨论】:

    标签: python django design-patterns django-models state-pattern


    【解决方案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()
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2013-08-04
    • 2017-01-05
    相关资源
    最近更新 更多