Django:保存模型时检测一组字段的更改

时间:2010-11-29 19:11:28

标签: python django django-models hash

问题

我的模型中有一个需要进行一些计算的字段。我想在保存模型时执行这些计算。但是,由于资源密集,我只想在某些字段发生变化时执行这些计算。

初步想法

将3个字段的哈希值保留为模型中的不同字段。在保存时,散列三个字段,如果等于当前在模型中保存的字段,则继续保存实例而无需进一步的工作。否则,执行计算,保存计算结果并保存新哈希值。

我的问题:

  1. 这是最好的选择吗?如果没有,请分享哪些更好,为什么。

  2. 如果没有更好的方法:我应该使用哪种哈希?为什么?

  3. 我应该使用哪种Django模型字段来保存哈希?

3 个答案:

答案 0 :(得分:4)

我将我最初想法的实施提交给其他人批评的答案:

models.py

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 )