使django不插入某些字段

时间:2017-03-02 09:29:12

标签: postgresql python-3.x django-models django-admin django-1.9

我有一个针对postgresql数据库表的Django模型,我希望Django在对象创建期间不插入field_3作为DB应该填写的时间戳字段。

class AbcModel:
  model_id = models.AutoField(primary_key=True)
  field_1 = models.BigIntegerField()
  field_2 = models.TextField()
  field_3 = models.DateTimeField(blank=True, null=True)

  class Meta:
    managed = False
    db_table = 'abc_table'

相应的表架构

abc_table

  • model_id integer not null default
    NEXTVAL( 'command_running_command_id_seq' :: regclass的)
  • field_1 integer not null
  • field_2 text not null
  • field_3时间戳没有时区默认现在()

我尝试了什么 - 我读到应该调用Model.save(update_fields = [要更新的字段列表])。

class AbcModel(models.Model):
    def save(self, *args, **kwargs):
        u_fields = ['field_1', 'field_2']
        super(CommandRunning, self).save(update_fields=u_fields)

但我得到了一个例外

Cannot force an update in save() with no primary key.

如果我在update_fields中包含model_id,则会出现以下异常

The following fields do not exist in this model or are m2m fields: model_id

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

事实:每当指定update_fields时,它会强制保存更新。这在插入期间没有帮助,因为我们没有自动生成的主键可用。

最终解决方案:

有一个名为_do_insert的方法,它在向数据库触发插入查询之前调用。可以覆盖它并删除我们不想插入的字段

def _do_insert(self, manager, using, fields, update_pk, raw):
        return super(AbcModel, self)._do_insert(
            manager, using,
            [f for f in fields if f.attname not in ['field_3']],
            update_pk, raw)

为了更好地理解,请尝试查看生成的插入查询。您将看到发送到数据库的插入SQL中缺少field_3。这允许数据库使用指定的默认值插入字段。