【问题标题】:Django: Detecting changes of a set of fields when a model is savedDjango:保存模型时检测一组字段的更改
【发布时间】:2011-05-17 11:12:46
【问题描述】:

问题

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

初步想法

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

我的问题:

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

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

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

【问题讨论】:

标签: python django django-models hash


【解决方案1】:

我正在提交我最初想法的实施,以作为其他人批评的答案:

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()

如果有人有任何建议、cmets 或疑虑; 分享!

【讨论】:

    【解决方案2】:

    向保存方法提供请求参数并定义此自定义保存方法:

    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
    

    【讨论】:

    • 你不需要存储任何#hash
    • 这假设您将在每次保存时传递一个请求。还假设 POST 变量在每个请求上都将被命名为相同。我不满意。
    【解决方案3】:

    为什么不将实例与数据库进行比较...类似于:

    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 )
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多