1

我不反对,我想Django的对象创建它的那个DB是为了填补在时间戳字段期间不插入field_3 PostgreSQL数据库表中的Django模型。化妆的Django无法插入某些领域

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整数NOT NULL默认
    NEXTVAL('command_running_command_id _seq':: regclass的)
  • field_1整数空
  • field_2文本不为空
  • field_3时间戳没有时区默认NOW()

我想什么 - 我读了一个应调用模型.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

为什么你需要数据库添加时间戳?你可以设置'''field_3 = models.DateTimeField(auto_now_add = True)'''添加日期,而不必担心找到解决方法?或者我错过了什么? – tdsymonds

+0

我没有拥有数据库模式。我应该只提供一个管理界面。 Django看起来像是一个非常自然的选择,它的惊人的inspectdb命令,但它生成的模型文件需要一些修改才能真正对齐到数据库。 – comiventor

回答

1

事实:无论何时指定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。这允许数据库使用指定的默认值插入字段。