问题 Django - 模型中的函数。如何从视图中调用它?


我正在Django设计一个模型,但我不知道这是不是最好的方法。我有一个名为“历史”的模型,在这个模型中,我有一个专门的函数来处理这个模型的插入。

备选方案1

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return str(self.field1.id)

    class Meta: #
        ordering = ['-field3']

    def insert_history(self):
        # Here I will have some business logic to insert the data to the history model

要将数据插入到History模型中,我总是必须使用“insert_history”函数。

我的问题是:

上面的代码是正确的吗? 

如果是,我如何从视图中调用“insert_history”?


备选方案2

我有另一种替代方案,我已经测试过并且有效,但感觉不对。代码如下所示:

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return str(self.field1.id)

    class Meta: #
        ordering = ['-field3']

def insert_history(field1, field2, field3):
    # Here I will have some business logic to insert the data to the history model

我从这样的观点来称呼它:

from app.models import insert_history

insert_history('1', True, 'some_date')

这样做的正确方法是什么?如果备选方案1是正确的,我如何从视图中调用“insert_history”?

最好的祝福,


10521
2018-01-13 14:24


起源

从你的代码中不清楚,但insert_history做了什么 manager.create() 不?如果是,那么功能的一个例子是什么? - ptr
是的,它将根据我将在“insert_history”中写入的一些逻辑设置field3,一个日期时间 - André
我希望你不是真的打电话给你的田地 field1, field2 和 field3 ...... :) - Anentropic


答案:


insert_history是否使用self?或者它是否创建了一个新的History对象?

如果它创建了一个新对象,我会这样做:

class History(models.Model):
    @classmethod
    def insert_history(cls, field1, field2, field3):
        # Here be code

打电话给它

from app.models import History
History.insert_history(field1, field2, field3)

顺便说一下,创建新对象的方法的常规名称是 create。另外,看看 https://docs.djangoproject.com/en/1.9/ref/models/instances/#creating-objects


10
2018-01-13 14:28



insert_history将创建一个新的History对象。我会测试你的代码。谢谢 - André
谢谢。有效! - André


我认为使用自定义管理器是最合适的 https://docs.djangoproject.com/en/dev/topics/db/managers/ 对于这个问题。


1
2018-01-13 14:30





只需选择您的历史记录实例(例如,使用主键1):

hist = History.objects.get(pk=1)

...并使用。调用您的方法 hist 变量:

hist.insert_history(...)

1
2018-01-13 14:30





要将数据插入到History模型中,我将始终使用 insert_history 功能。

是的,它会根据我将在里面写的一些逻辑设置field3,一个日期时间 insert_history

最简单的方法是覆盖 save 方法

class History(models.Model):
    field1 = models.ForeignKey(Request)
    field2 = models.BooleanField()
    field3 = models.DateTimeField()

    def __unicode__(self):
        return unicode(self.field1.id) # __unicode__ should return unicode,
                                       # not string.

    class Meta: #
        ordering = ['-field3']

    def save(self, *args, **kwargs):
        self.field3 = your calculated value
        super(History, self).save(*args, **kwargs)

现在,每当你保存你的方法 - field3的值将是您的自定义保存方法中的计算结果。您无需修改​​视图中的任何内容即可使其正常工作。


0
2018-01-13 14:49