【问题标题】:django forms to db tabledjango 表格到 db 表
【发布时间】:2009-11-30 09:59:09
【问题描述】:

在 Django 中,如果我是一个类型的对象: django.forms.BooleanField 例如,我如何知道它将被保存到什么数据库类型,例如整数,布尔值,Varchar? 我知道 Django 会自动将其作为模型的一部分进行处理,但我想手动执行此操作,因此这不是一个选项。是否有一个内置的 Django 函数我可以调用它来告诉我这些信息,或者我必须手动执行它,例如创建一个返回传入表单元素的 db 类型的函数?

【问题讨论】:

    标签: django forms types


    【解决方案1】:

    我知道这个帖子现在已经过时了,但我想发布已经有一种方法可以确定使用 django 创建的表/字段:

    django-admin.py sqlall <appname>
    

    更多详情请参阅django-admin docs

    【讨论】:

      【解决方案2】:

      BooleanField 将主要保存为布尔值,但使用 MySQL 支持的 Django 项目时除外:

      MySQL 中的布尔字段存储为 一个 TINYINT 列,其值为 0 或 1(大多数数据库都有 而是正确的 BOOLEAN 类型)。

      请参阅docs

      据我所知,没有内置的方法来覆盖字段类型(它没有在docs 中列出)。你为什么想这么做?您是否尝试将数据插入到已经存在的表中?如果您想这样做,请自己手动创建表,并使用managed Meta 选项。

      【讨论】:

      • 我不想覆盖它我只是想找出一个字段映射到数据库中的什么。所以使用这个例子,如果我有一个 BooleanField 类型的字段,我会知道这将被存储为一个 TINYINT。一些 sudo 代码可能类似于: frmObj = django.forms.BooleanField dbType = db_type(django.forms.BooleanField) print dbType # 这会打印出 TINYINT 或另一个等于 TINYINT 的 django 模型
      • 但是为什么呢?除了 MySQL BooleanFields 映射到 TINYINT 之外,不是所有的字段类型都相当明显吗?为什么你需要知道它们是如何存储的? Django 的一大优点是这些东西(数据的存储方式)已经为您抽象出来了。
      • 是的,它们都相当明显,我认为编写一个函数来完成我所追求的事情并不难,但它似乎已经编写好了。如果您阅读了上述帖子(无需重新输入 :))我正在尝试存储从动态表单返回的数据。但是,我不想将所有数据保存为简单的 varchars,而是存储它们应该是什么类型的数据,例如日期、整数、布尔值等,然后我可以将其用于将来的处理
      【解决方案3】:

      这个问题真的没有意义。与模型表单相反,表单与数据库没有任何连接,因此没有任何此类“映射”,并且您无法“保存”它。

      根据评论编辑:很公平,但根本没有您描述的任何映射。如果要将非模型表单的结果保存到数据库,则需要定义如何完成。因此,由您决定将字段保存为哪种类型。

      第二次编辑不,因为表单和数据库之间没有关系。我不知道我该如何进一步解释这一点。 模型字段 知道 a) 要创建什么数据库类型和 b) 要创建什么表单字段,但是该映射不能反向工作 - 为什么会这样?如果您想将表单字段保存到数据库中,您需要了解的不仅仅是“它是什么数据类型”。您需要知道要保存它的列的名称、该列所属的表以及该列需要满足的任何约束——这些都不是由表单定义的,因为它们都是由 模型。

      您可以尝试遍历 django.db.models.fields 中所有不同的模型字段类型,查看每个的 formfield() 方法,看看它是否创建了一个 BooleanField,然后如果它确实从 get_internal_type() 获取数据库类型, 但这让我觉得这是一件非常可怕、丑陋和低效的事情 - 更不用说映射到不同数据库类型的两个模型字段不能同时使用 BooleanField 作为它们的表单字段表示的事实.

      【讨论】:

      • 我有一个动态构建的表单。此表单可能包括:django.forms.CharField、django.forms.MultipleChoiceField、django.forms.IntegerField django.forms.DateField 我现在将其保存到数据库中。我有一个具有以下结构的表:id |答案 | answer Type id 是一个自动递增字段。 answer 将是表单返回的值。此列是 varchar 类型。 answer_type 将返回返回的数据类型。所以从上面的示例表单中,第一个值是 varchar,下一个 varchar,下一个 int,最后是 datetime
      • 在 Django 中肯定有一些东西说:如果模型有一个类型为 django.models.DateTimeField 的字段,那么创建一个类型为 django.forms.DateField 的表单元素,因为这就是模型表单的工作方式。所以反过来说,如果一个对象的类型是:django.forms.DateField,那么字段对象必须是类型:django.models.DateTimeField,然后它会反过来告诉你对象的类型:django。 models.DateTimeField 存储为数据库类型 datetime
      猜你喜欢
      • 2020-11-09
      • 2016-06-17
      • 2011-06-28
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多