Postgresql 使django不插入某些字段

Postgresql 使django不插入某些字段,postgresql,python-3.x,django-models,django-admin,django-1.9,Postgresql,Python 3.x,Django Models,Django Admin,Django 1.9,我有一个针对postgresql数据库表的Django模型,我希望Django在对象创建过程中不要插入字段_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, nul

我有一个针对postgresql数据库表的Django模型,我希望Django在对象创建过程中不要插入字段_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表

模型id整数不为空默认值 下一个'command_running_command_id_seq'::regclass 字段_1整数不为空 字段_2文本不为空 现在没有时区默认值的字段\u 3时间戳 我试过的- 我读到应该调用Model.saveupdate_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_字段中包含model_id,我会得到以下异常

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

我在这里遗漏了什么?

事实:无论何时指定更新字段,都会强制保存以更新。这在插入期间没有帮助,因为我们没有自动生成的主键

最终解决方案:

有一个名为_do_insert的方法,它在向数据库激发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)

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

事实:无论何时指定更新字段,都会强制保存以更新。这在插入期间没有帮助,因为我们没有自动生成的主键

最终解决方案:

有一个名为_do_insert的方法,它在向数据库激发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)

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

为什么需要数据库添加时间戳?您只需设置字段_3=models.DateTimeFieldDauto_now_add=True即可添加日期,而不必担心找到解决方法?或者我遗漏了什么?我不拥有数据库模式。我应该只在上面提供一个管理界面。Django使用其惊人的inspectdb命令看起来是一个自然选择,但它生成的模型文件需要一些修改才能真正与数据库对齐。为什么需要数据库添加时间戳?您只需设置字段_3=models.DateTimeFieldDauto_now_add=True即可添加日期,而不必担心找到解决方法?或者我遗漏了什么?我不拥有数据库模式。我应该只在上面提供一个管理界面。Django使用其惊人的inspectdb命令看起来是一个自然的选择,但它生成的模型文件需要一些修改才能真正与数据库对齐。