【发布时间】:2012-06-20 13:25:14
【问题描述】:
编辑:我完全重写了这个问题,因为原来的问题没有清楚地解释我的问题
我想运行一个特定于每个特定模型实例的函数。
理想情况下,我想要这样的东西:
class MyModel(models.Model):
data = models.CharField(max_length=100)
perform_unique_action = models.FunctionField() #stores a function specific to this instance
x = MyModel(data='originalx', perform_unique_action=func_for_x)
x.perform_unique_action() #will do whatever is specified for instance x
y = MyModel(data='originaly', perform_unique_action=func_for_y)
y.perform_unique_action() #will do whatever is specified for instance y
但是没有数据类型 FunctionField。通常这可以通过继承和创建 MyModel 的子类来解决,可能是这样的:
class MyModel(models.Model):
data = models.CharField(max_length=100)
perform_unique_action = default_function
class MyModelX(MyModel):
perform_unique_action = function_X
class MyModelY(MyModel):
perform_unique_action = function_Y
x = MyModelX(data='originalx')
x.perform_unique_action() #will do whatever is specified for instance x
y = MyModelY(data='originaly')
y.perform_unique_action() #will do whatever is specified for instance y
不幸的是,我认为我不能使用继承,因为我试图以这种方式访问该函数:
class MyModel(models.Model):
data = models.CharField(max_length=100)
perform_unique_action = default_function
class SecondModel(models.Model):
other_data = models.IntegerField()
mymodel = models.ForeignKey(MyModel)
secondmodel = SecondModel.objects.get(other_data=3)
secondmodel.mymodel.perform_unique_action()
问题似乎是,如果我覆盖子类中的 perform_unique_action,我不知道 SecondModel 中的外键是什么类型。
我可以从 SecondModel 作为外键访问 MyModel 并且对 MyModel 的每个实例仍然具有唯一的功能吗?
【问题讨论】:
-
我真的不明白你在做什么。但对我来说,看起来你可以在你的信号方法中实现同样的事情,而不需要整个“模型中的函数”方法。你能试着多描述一下你的问题吗?尤其是最后一段很难理解。
-
更新了最后一段。如果你能提供一个类似于上面的例子,说明如何在信号方法中实现同样的事情,而不需要序列化函数,那就太好了。
-
除了您认为您要运行的方法必须在模型中之外,还有其他好的理由吗?如果不是,为什么不在保存扩展对象时(通过信号)运行该方法?您可以从信号方法中获取几乎所有可能需要的数据,因为实际实例已传递给该方法。
-
我再次阅读了您的帖子并有了另一个想法。您想使用与扩展不同的功能来“专门化”您的
Extension模型。听起来您应该在模型中使用继承。定义一个基本模型Extension,然后通过创建另一个继承基本模型并覆盖该方法的模型来定义该模型的专用版本。由于您想分离关注点,您还应该将这些单独的扩展拆分为几个 Django 应用程序。