python - 如何在 django 模型中存储函数

标签 python django models

编辑:我完全重写了问题,因为原来的问题没有清楚地解释我的问题

我想运行一个特定于每个特定模型实例的函数。

理想情况下我想要这样的东西:

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 的每个实例仍然具有唯一的函数吗?

最佳答案

这对我有用。我还没有测试过它,但你应该能够创建另一个类并覆盖它们的方法,它会起作用。检查class Meta行,它会将其视为抽象类。这是我现在正在学习的实际类(class)的示例。

编辑:添加了 VoteComment 类并对其进行了测试。它按预期工作!

class Vote(models.Model):
    VOTE_ENUM = (
        (VoteEnum.DOWN_VOTE, VoteEnum.toString(VoteEnum.DOWN_VOTE)),
        (VoteEnum.NONE, VoteEnum.toString(VoteEnum.NONE)),
        (VoteEnum.UP_VOTE, VoteEnum.toString(VoteEnum.UP_VOTE)),

    )
    question = models.ForeignKey(Question, null=False, editable=False, blank=False)
    voter = models.ForeignKey(User, blank=False, null=False, editable=False)
    vote_type = models.SmallIntegerField(default=0, null=False, blank=False, choices=VOTE_ENUM)

    class Meta:
        abstract = True

    def is_upvote(self):
        return self.vote_type > 0
    def is_downvote(self):
        return self.vote_type < 0

class VoteAnswer(Vote):
    answer = models.ForeignKey(Answer, null=False, editable=False, blank=False)

    class Meta:
        unique_together = (("voter", "answer"),) # to prevent user from voting on the same question/answer/comment again

    def __unicode__(self):
        vote_type = "UP" if vote_type > 0 else ("DOWN" if vote_type < 0 else "NONE")
        return u"{0}: [{1}] {2}".format(user.username, vote_type, answer.text[:32])

    def is_upvote(self):
        return "FOO! "+str(super(VoteAnswer, self).is_upvote())

class VoteComment(Vote):
    comment = models.ForeignKey(Comment, null=False, editable=False, blank=False)

    class Meta:
        unique_together = (("voter", "comment"),) # to prevent user from voting on the same question/answer/comment again

    def __unicode__(self):
        vote_type = "UP" if vote_type > 0 else ("DOWN" if vote_type < 0 else "NONE")
        return u"{0}: [{1}] {2}".format(user.username, vote_type, comment.text[:32])

    def is_upvote(self):
        return "BAR!"

关于python - 如何在 django 模型中存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11120652/

相关文章:

python - Pandas - 将行日期与列时间结合起来

python - 如何将每一行的第一列数据添加到相应行中由某些特定字符串或字符标记的每一列的标题?

python - 在磁盘上保留 numpy 数组的最佳方法

django - 使用内联表单集进行Django表单验证

python - 无法让 url 函数与 django 中的特定语法一起使用

python - 如何在 Python 中使用 ChatGPT 和 langchain 将上下文/聊天历史合并到 OpenAI ChatBot 中?

python - Django - 脆皮表格可以分成两列吗?

python - 一个友情关系问题

controller - 获取 Laravel 4.1 中模型返回的记录总和

node.js - Sails.js Waterline ORM : . findOrCreate() 没有 .populate() 方法