如何在Django模型中排除字段.Model.save()

时间:2017-09-21 14:55:40

标签: django python-3.x django-models

我有以下model,保存后根据hash_id计算pk字段:

class MyTable(models.Model):
    something = models.CharField(max_length=255)
    reported = models.IntegerField(default=0, blank=True)
    hash_id = models.CharField(max_length=32, db_index=True, unique=True, blank=True)

    def save(self, *a, **kw):
        super().save(*a, **kw)
        self.hash_id = hash_fn(self.pk)
        super().save(*a, **kw)

在我的一个views中,我有以下行,它们应该将reported字段增加1,但reported增加2,因为被覆盖{{1}方法:

save

理想情况下,我想要的是:

my_table_ins.reported = F('reported') + 1
my_table_ins.save()

2 个答案:

答案 0 :(得分:2)

根据官方文档,您可以使用 update_fields 参数指定要保存的字段:

my_table_ins.reported = F('reported') + 1
my_table_ins.save(update_fields=['reported', ])  # This will only save 'reported'

文档可在此处获取:

https://docs.djangoproject.com/en/1.11/ref/models/instances/#specifying-which-fields-to-save

答案 1 :(得分:0)

添加到@ martin-castro-alvarez答案中,如果要更新除少数几个字段以外的所有字段,可以执行以下操作:

fields_to_exclude = {'reported','another_field'}
# automatically populate a list with all fields, except the ones you want to exclude
fields_to_update = [f.name for f in MyTable._meta.get_fields() if f.name not in fields_to_exclude and not f.auto_created]
my_table_ins.save(update_fields=fields_to_update)

这将在Django> = 1.8中工作。在旧版本中,您可以使用model._meta.get_all_field_names()