【问题标题】:Check if values are valid before create()在 create() 之前检查值是否有效
【发布时间】:2021-02-25 12:27:06
【问题描述】:

您好,我正在尝试从 CSV 导入行,但我无法处理类型错误。 例如,如果您在日期时间字段中插入字符串,我会在创建时收到此错误:

psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

尽管处理错误

try:
  my_module.create()
exception Except:
  #stuff
  pass

如何在创建或至少处理错误并采取其他措施之前检查这些值。目前,如果我插入一个选择中不存在的字段,我可以使用 try catch 进行管理,但我不能用于数据类型

【问题讨论】:

    标签: python postgresql odoo


    【解决方案1】:

    BaseModel 上有一个方法 load(fields, data),您可以扩展它。

    class MyModel(models.Model):
        # if a new model
        _name = 'my.model'
        # if an extended model
        #  _inherit = 'my.model'
    
        def load(self, fields, data):
        """ Extended to do stuff to the data before importing it to database"""
            # do stuff like converting weird data input
            clean_data = self.clean_data(data)
            # call super with cleaned data afterwards
            return super(MyClass, self).load(fields, clean_data)
    

    【讨论】:

      【解决方案2】:

      对于数据类型,您实际上可以。即使我不太了解您的代码,您也可以将变量显式转换为特定数据类型,然后在该特定转换失败中捕获 ValueError 异常,如下所示:

        try:
          int(variable)
        except ValueError:
          print("Variable was not an integer.")
      

      【讨论】:

      • vals is a dict {'name":"Marco", "birth_date":"CIAO",....} ok? in create i pass vals,但问题是,我不能管理写入字段的错误,尤其是当它们属于不同类型时。
      • 然后在传递 val 以创建之前检查 dict 值是否匹配所需数据类型的错误。例如,如果您知道与birth_date 键关联的值必须是日期时间对象,请通过强制转换并捕获最终异常来检查它是否真的存在。
      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2014-12-01
      相关资源
      最近更新 更多