让django不插入某些字段
make django not insert certain fields
我有一个针对 postgresql 数据库的 Django 模型 table 我希望 Django 在对象创建期间不插入 field_3 作为数据库应该填写的时间戳字段。
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'
对应的table架构
abc_table
- model_id 整数非空默认值
nextval('command_running_command_id_seq'::regclass)
- field_1 整数不为空
- field_2 文本不为空
- field_3 timestamp without time zone default now()
我试过的 -
我读到应该调用 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
我在这里错过了什么?
事实:每当指定 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。这允许数据库使用指定的默认值插入字段。
我有一个针对 postgresql 数据库的 Django 模型 table 我希望 Django 在对象创建期间不插入 field_3 作为数据库应该填写的时间戳字段。
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'
对应的table架构
abc_table
- model_id 整数非空默认值
nextval('command_running_command_id_seq'::regclass) - field_1 整数不为空
- field_2 文本不为空
- field_3 timestamp without time zone default now()
我试过的 - 我读到应该调用 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
我在这里错过了什么?
事实:每当指定 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。这允许数据库使用指定的默认值插入字段。