【问题标题】:CharField being shown as IntegerField in DatabaseCharField 在数据库中显示为 IntegerField
【发布时间】:2014-10-14 10:04:11
【问题描述】:

我们正在制作一个电影数据库应用程序并使用 Django 1.7 和 PostgreSQL。

这是我们的models.py 文件的样子:

class Movies(models.Model):
    name = models.CharField(max_length=50)
    lang = models.ForeignKey(Language, null=True)
    genre = models.ForeignKey(Genre, null=True)
    cast = ArrayField(models.CharField(max_length=50))

为了容纳ArrayField,我们使用了

from djorm_pgarray.fields import ArrayField
from djorm_expressions.models import ExpressionManager

进出模型。

以下是为cast生成的SQL:

ALTER TABLE movies_movies ADD COLUMN "cast" integer[];

知道为什么 cast 列是整数,即使我们指定了 CharField?

【问题讨论】:

  • 旁注:"cast" 是表列的错误名称。它是一个保留字。示例:cast('123' as integer)
  • 注明。但问题是另外一回事。将 cast 更改为 castor 没有帮助。

标签: python django postgresql


【解决方案1】:

根据djorm_pgarray docs,您可以创建如下文本数组:

from djorm_pgarray.fields import TextArrayField

class Movies(models.Model):
    # ...
    cast = TextArrayField(dimension=1)

或者,根据this文章:

from djorm_pgarray.fields import ArrayField

class Movies(models.Model):
    # ...
    cast = ArrayField(dbtype="text", dimension=1)

关于文本字段的max_length(varchar 和 text 实际上与 postgres 相同):不确定,是否可以在 postgres 的数组中定义它。

【讨论】:

  • Postgres 可以很好地处理varchar(50)[] 字段;相应地设置dbtype 可能就足够了。但正如您所指出的,字符串类型在底层都是相同的,因此除非您的应用程序逻辑实际上需要长度约束,否则您最好使用text。
猜你喜欢
  • 2020-03-21
  • 2016-08-10
  • 2016-09-05
  • 2016-10-23
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多