我正在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”?
最诚挚的问候,
答案 0 :(得分:10)
insert_history是否使用self?或者它是否创建了一个新的历史对象?
如果它创建了一个新对象,我会这样做:
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)
BTW,创建新对象的方法的常规名称是create
。另外,请查看https://docs.djangoproject.com/en/1.9/ref/models/instances/#creating-objects
答案 1 :(得分:2)
要将数据插入历史记录模型,我将始终使用
insert_history
函数。是的,它会根据我将在
insert_history
内写的一些逻辑设置field3,一个日期时间
最简单的方法是覆盖save
method:
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
的值都将是自定义保存方法中计算的结果。您无需修改视图中的任何内容即可实现此目的。
答案 2 :(得分:1)
我认为最适合使用自定义管理器https://docs.djangoproject.com/en/dev/topics/db/managers/解决此问题。
答案 3 :(得分:1)
只需选择历史记录实例(例如,使用主键1):
hist = History.objects.get(pk=1)
...并使用hist
变量调用您的方法:
hist.insert_history(...)
答案 4 :(得分:0)
仅需扩展@burhankhalid的回答,由于我对Rep的要求很高,因此无法发表评论,在保存我的矿山的同时,我也有必要更改另一种模型,但是Burhan Khalid提出的解决方案帮助我开始了
我需要修改的模型,对此我有一个参考
我的建议假设Request会有一个“ attrib1”,并且它尝试保存History.field2中的值
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
self.field1.attrib1 = self.field2 # for instance
self.field1.save() # don't forget to save the other
super(History, self).save(*args, **kwargs)
因此,重写save()方法并修改(并保存)其他对象的整个概念也有所不同