2

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

第 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 对象。那么,为什么存在这些不同的方法?

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

提前致谢。

4

1 回答 1

10

我会试着回答他们:

问:什么时候deconstruct()使用?

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


问:db_type()和之间的区别get_internal_type()

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

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

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


问:get_prep_value()和之间的区别get_db_prep_value()

A:这些家伙在 和 之间也有相同的almost逻辑。首先,这两种方法都代表将 db 值转换为. 但是,和方法一样,代表特定的字段类型。db_type()get_internal_type()python objectsdb_typeget_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他们甚至在文档中放了一个示例代码


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

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

并将from_db_value数据库返回的值转换为python对象。实际上从未听说过。但是从文档中检查这部分:

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

于 2016-12-18T08:56:41.627 回答