【问题标题】:How to exclude field in Django models.Model.save()如何在 Django models.Model.save() 中排除字段
【发布时间】:2018-03-02 23:58:22
【问题描述】:

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

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,因为覆盖了save 方法:

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

理想情况下,我想要一些东西:

    def save(self, *a, **kw):
        super().save(*a, exclude=['reported'], **kw)
        self.hash_id = hash_fn(self.pk)
        super().save(*a, **kw)

【问题讨论】:

  • 这是在here之前提出的

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


【解决方案1】:

根据官方文档,您可以使用 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

【讨论】:

    【解决方案2】:

    添加到@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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 2011-07-19
      • 2015-11-03
      • 2012-06-14
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      相关资源
      最近更新 更多