我的模型中有一个需要进行一些计算的字段。我想在保存模型时执行这些计算。但是,由于资源密集,我只想在某些字段发生变化时执行这些计算。
将3个字段的哈希值保留为模型中的不同字段。在保存时,散列三个字段,如果等于当前在模型中保存的字段,则继续保存实例而无需进一步的工作。否则,执行计算,保存计算结果并保存新哈希值。
这是最好的选择吗?如果没有,请分享哪些更好,为什么。
如果没有更好的方法:我应该使用哪种哈希?为什么?
我应该使用哪种Django模型字段来保存哈希?
答案 0 :(得分:4)
我将我最初想法的实施提交给其他人批评的答案:
from hashlib import md5
class Stop(models.Model):
line = models.CharField(max_length=12)
street = models.CharField(max_length=32, choices=STREET_CHOICES)
order = models.PositiveIntegerField(blank=True, null=True)
location_hash = models.CharField(max_length=32, null=True)
def save(self):
location_hash = md5('%s@%s' % (self.line, self.street))
if self.location_hash != location_hash:
self.order = calculate_order(line=self.line, street=self.street)
self.location_hash = location_hash
super(Stop, self).save()
如果有人有任何建议,意见或疑虑; 请分享!
答案 1 :(得分:1)
为save方法提供请求参数并定义此自定义保存方法:
def save(self, request=False, *args, **kwargs):
if request and request.POST.get('var1',False) and request.POST.get('var2',False) and request.POST.get('var3',False):
######
##Do your calculations
######
super(Model, self).save(*args, **kwargs)
将您的admin.py更新为以下内容:
class ModelAdmin(admin.ModelAdmin):
....
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
instance.save(request=request)
return instance
答案 2 :(得分:0)
为什么不将实例与db进行比较...类似于:
class MyModel( models.Model ):
description = models.CharField( max_length=12 )
def save(self, *args, **kwargs):
if not MyModel.objects.filter( id = self.id, description__exact = self.description ).exists():
### do complex logic here ###
super( MyModel, self ).save( *args, **kwargs )