Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否将模型方法用作Django模型的默认值?_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

Python 是否将模型方法用作Django模型的默认值?

Python 是否将模型方法用作Django模型的默认值?,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,实际上,我的模型中有这种方法: def speed_score_compute(self): # Speed score: #

实际上,我的模型中有这种方法:

def speed_score_compute(self):
  # Speed score:                                                                                                     
  #                                                                                                                  
  #   - 8 point for every % of time spent in                                                                         
  #     high intensity running phase.                                                                                
  #   - Average Speed in High Intensity                                                                              
  #     running phase (30km/h = 50 points                                                                            
  #     0-15km/h = 15 points )

  try:
    high_intensity_running_ratio = ((
      (self.h_i_run_time * 100)/self.training_length) * 8)
  except ZeroDivisionError:
    return 0
  high_intensity_running_ratio = min(50, high_intensity_running_ratio)
  if self.h_i_average_speed < 15:
    average_speed_score = 10
  else:
    average_speed_score = self.cross_multiplication(
      30, self.h_i_average_speed, 50)
  final_speed_score = high_intensity_running_ratio + average_speed_score
  return final_speed_score
但这不起作用(请参阅下面的错误消息)。我检查了不同的主题,如,但这只适用于函数(不使用
self
属性),而不适用于方法(我必须使用方法,因为我使用的是实际的对象属性)

似乎在谈论这件事,但我没有弄清楚,可能是因为我还是Django和编程的新手

有没有办法做到这一点

编辑:

我的函数是在我的模型上面定义的。但这是我的错误信息:

ValueError:在contraction.models中找不到函数speed\u score\u compute。
请注意,由于Python2的限制,您无法序列化未绑定的方法函数(例如,在同一类主体中声明和使用的方法)。请将函数移到主模块体中以使用迁移。
有关详细信息,请参阅https://docs.djangoproject.com/en/1.8/topics/migrations/#serializing-价值观

错误信息很清楚,似乎我无法做到这一点。但是,还有其他方法可以实现这一点吗?

问题 当我们提供一个
default=callable
并提供一个来自模型的方法时,它不会被作为模型实例的
self
参数调用

覆盖
save()
我没有找到比重写
MyModel.save()
*更好的解决方案,如下所示:

class MyModel(models.Model):
    def save(self, *args, **kwargs):
        if self.speed_score is None:
            self.speed_score = ...
            # or
            self.calculate_speed_score()

        # Now we call the actual save method
        super(MyModel, self).save(*args, **kwargs)
这样,如果您试图保存模型,而没有为该字段设置值,则会在保存之前填充模型

就个人而言,我更喜欢这种方法,即在模型中定义属于模型的所有内容(数据、方法、验证、默认值等)。我认为这种方法被称为fat Django模型方法

*如果你找到一个更好的方法,我也想了解它

使用
pre_save
信号 Django提供在模型上运行
save()
之前运行的信号。信号同步运行,即在模型上调用
save()
之前,需要完成
pre_save
代码的运行。您将获得与重写
save()
相同的结果(以及执行顺序)

如果您希望将默认值行为与模型分开,那么这种方法适合您

何时调用
save()
?我可以在保存对象之前使用它吗? 好问题!因为我们希望能够在保存填充默认值之前使用对象

要获取对象而不保存它,只需使用它,我们可以执行以下操作:

instance = MyModel()
如果使用
MyModel.objects.create()
创建它,则将调用
save()
。它基本上相当于:

instance = MyModel()
instance.save()

如果您感兴趣,还可以定义一个
MyModel.populate\u default\u values()
,您可以在对象生命周期的任何阶段调用它(在创建、保存或按需时,由您决定)

My
speed\u score\u compute()
函数是在
speed\u score
模型上面定义的。“但这不起作用”意味着什么?错误?无效结果?问题已被更新为我的错误消息。我有很多关于分数计算的方法,我只是在这里放了一个来保持问题的清晰。如果我删除
activity\u score\u compute()。我将进行编辑,将speed_分数设为1,以避免混淆。@Addict我可以修改您的问题,使其更通用和规范,以便任何提出相同问题的人都可以轻松引用它吗?我想知道在Django进程中何时调用save方法?每次你创建一个新对象或?…我想
s=SpeedScore()
不会调用
save()
,但是
SpeedScore.objects.create()
会调用,所以你可以在保存对象之前控制并使用它。我想稍微说一点,我认为
pre\u save
信号更好。它对
save()
的默认行为影响较小,通过查看
update\u字段
实例
发送者
等参数,它还有更好的界面来检查对象状态。在这里,我还将使用
预保存
添加一个部分,为什么不呢:PThanks@Sayse,添加了它!
instance = MyModel()
instance = MyModel()
instance.save()