【问题标题】:Overriding methods for defining custom model field in django在 django 中定义自定义模型字段的覆盖方法
【发布时间】:2017-05-03 12:51:45
【问题描述】:

我一直在尝试在 python 中定义自定义 django 模型字段。我在以下位置 https://docs.djangoproject.com/en/1.10/howto/custom-model-fields/ 引用了 django 文档。但是,我对以下方法感到困惑(根据我的理解,我将它们分成了几组):-

第 1 组(根据文档,该组中的方法相互关联)

  1. __init__()
  2. 解构()

第 2 组

  1. db_type()
  2. rel_db_type()
  3. get_internal_type()

第 3 组

  1. from_db_value()
  2. to_python()
  3. get_prep_value()
  4. get_db_prep_value()
  5. get_db_prep_save()
  6. value_from_object()
  7. value_to_string()

第 4 组

  1. 表单域

我有以下问题:-

  1. 什么时候使用deconstruct()?文档说,它在迁移期间很有用,但没有明确解释。而且,什么时候叫?

  2. db_type()get_internal_type() 之间的区别

  3. get_prep_value()get_db_prep_value() 之间的区别
  4. value_from_object()value_to_string() 之间的区别。 value_from_object() 未在文档中提供。
  5. from_db_value()value_to_string()to_python() 都从字符串中提供 python 对象。那么,为什么存在这些不同的方法呢?

我知道,我问了一个有点冗长的问题。但是找不到任何其他方式来更好地提出这个问题。

提前致谢。

【问题讨论】:

    标签: python django django-models django-model-field


    【解决方案1】:

    我会尽力回答他们:

    问:什么时候使用deconstruct()

    答:当您拥有 Field 的实例以根据您刚刚传入 __init__ 的参数重新创建它时,将使用此方法。 正如他们在docs 中提到的,如果您在__init__ 方法中将max_length arg 设置为静态值;您的实例不需要它。因此,您可以在 deconstruct() 方法中将其删除。有了这个,max_length 在您的模型中使用它时不会出现在您的实例中。您可以将deconstruct 视为在模型中使用您的字段之前的最后清理和控制位置。


    问:db_type()get_internal_type()的区别

    答:它们都是相关的,但属于不同的层次。

    如果您的自定义字段的数据类型取决于您使用的数据库,db_type() 是您可以进行控制的地方。同样,就像他们在docs 中提到的那样,如果您的字段是一种日期/时间值,您应该/可以在此方法中检查当前数据库是PostgreSQL 还是MySQL。因为虽然日期/时间值在PostgreSQL 中称为timestamp,但在MySQL 中称为datetime

    get_internal_type 方法是db_type() 的高级版本。让我们看一下日期/时间值示例:如果您不想检查和控制每个数据类型属于不同的数据库,您可以从 built-in Django 字段继承自定义字段的数据类型。而不是检查它是否应该是datetimetimestamp;您可以在 get_internal_type 方法中简单地返回 DateField。正如他们在docs 中提到的,如果您已经创建了db_type 方法,在大多数情况下,您不需要get_internal_type 方法。


    问:get_prep_value()get_db_prep_value()的区别

    答: 这些家伙在db_type()get_internal_type() 之间也分享almost 相同的逻辑。首先,这两种方法都代表将 db 值转换为python objects。但是,就像在db_type 方法中一样,get_db_prep_value() 代表backend 特定的字段类型。


    问:value_from_object()value_to_string() 的区别。 value_from_object() 未在文档中给出

    答:来自文档:

    要自定义序列化程序如何序列化值,您可以 覆盖value_to_string()。使用value_from_object() 是最好的方法 在序列化之前获取字段的值。

    所以,实际上我们不需要 value_from_object 记录。此方法用于在序列化之前获取字段的原始值。使用此方法获取值,并在value_to_string 方法中自定义其应如何序列化。他们甚至在docs中放了一个示例代码


    问:from_db_value()value_to_string()to_python() 都从字符串中给出 python 对象。那么,为什么存在这些不同的方法呢?

    答:to_python() 将字段值转换为有效的 Python 对象,value_to_string() 使用您的自定义序列化将字段值转换为字符串。它们代表不同的工作。

    from_db_value将数据库返回的值转换为python对象。实际上从未听说过。但是请查看文档中的this part

    该方法不适用于大多数内置字段作为数据库 后端已经返回正确的 Python 类型,或者后端本身 进行转换。

    【讨论】:

    • 第一个答案还不清楚,当 deconstruct() 被调用时。此外 get_prep_value() 和 get_db_prep_value() 也具有误导性,因为文档说它们用于将值从 python 类型转换为 dbcolumn 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多