在django的行动

在django的行动,django,django-admin,Django,Django Admin,如何根据字段的值启用或禁用操作。例如,在我的模型中,我有一个状态字段,该字段的值可以是“激活”、“挂起”,“已过期”。我正在执行一个将状态设置为“激活”的操作。我希望仅当状态为“挂起”时才启用该操作。这是策略和状态设计模式的某种组合 您将为操作定义方法函数,并且希望该方法函数对模型实例的状态敏感 这就是我们要做的 class SpecialProcessing( object ): def __init__( self, aModelObject ): self.mode

如何根据字段的值启用或禁用操作。例如,在我的模型中,我有一个状态字段,该字段的值可以是“激活”、“挂起”,“已过期”。我正在执行一个将状态设置为“激活”的操作。我希望仅当状态为“挂起”时才启用该操作。

这是策略和状态设计模式的某种组合

您将为操作定义方法函数,并且希望该方法函数对模型实例的状态敏感

这就是我们要做的

class SpecialProcessing( object ):
    def __init__( self, aModelObject ):
        self.modelObject= aModelObject
    def someMethod( self ):
        pass

class SpecialProcessingActivate( SpecialProcessing ):
    def someMethod( self ):
        # do work if possible or raise exception of not possible

class SpecialProcessingPending( SpecialProcessing ):
    def someMethod( self ):
        # do work if possible or raise exception of not possible

class SpecialProcessingExpired( SpecialProcessing ):
    def someMethod( self ):
        # do work if possible or raise exception of not possible

class MyObject( models.Model ):
    status = models.CharField( max_length = 1 )
    def setState( self ):
        if self.status == "a":
            self.state = SpecialProcessingActivate(self)
        elif self.status == "p":
            self.state = SpecialProcessingPending(self)
        elif self.status == "x":
            self.state = SpecialProcessingExpired(self)
        else:
            raise Exception( "Ouch!" )
    def doSomething( self ):
        self.setState()
        self.state.someMethod()

这样,我们可以自由添加新的状态和状态转换规则,而不会过多地干扰模型类。

管理操作方法为您提供查询集。只需为挂起设置一个排除或过滤器

我认为使用queryset是一种很好的方法

这将评估queryset,每行产生一个查询或操作。如果您使用过滤器,您将删除未指定的对象,并允许您通过一次swing修改整个queryset。这取决于更改发生的时间和方式。在许多情况下,状态更改是一个大问题,这里的逐行查询评估是正在发生的事情的核心,而此查询是事务的核心。这是一个好问题!我的回答是:是的!