首页 > 解决方案 > CIEmail 或 CIText 的 Django postgresql ArrayField 默认为 callable 在运行测试时引发错误

问题描述

跳过下面的答案

我确实找到了解决方案,但我认为这方面的文档不是很好。离开时对其他人有更好的搜索能力

我正在尝试使用一组通用电子邮件来创建一个联系人组,该联系人组由外部电子邮件列表与组用户混合组成。在我使用的模型中:

class ContactGroup(models.Model):
    users = models.ManyToManyField(settings.AUTH_USER_MODEL)
    emails = ArrayField(CIEmailField(), default=list)

在我尝试运行测试之前,此代码一切正常。尝试对我的项目运行测试时出现此错误。

django.db.utils.ProgrammingError: type "citext[]" does not exist
LINE 1: ...RIMARY KEY, "role" varchar(16) NOT NULL, "emails" citext[] N...

我对数据库的了解有限(因为我认为使用 django 之类的东西对我有用),但我知道这不是数据库本身的问题,因为它在实际运行时可以工作。这似乎只是 django 如何设置测试数据库的问题。我看过一些帖子,似乎表明该扩展程序在此过程中安装得太晚了,但我认为这不是我的问题,因为我从来不需要安装任何扩展程序来让它首先工作 - 我相信它是我的 postgresql 版本中核心的一部分。

如果我只允许 null 为真并完全删除默认值,我就可以让它工作。

如果我在下面更改此行,那么我运行测试没有问题,但我收到警告,使用可调用对象而不是列表实例。

-     emails = ArrayField(CIEmailField(), default=list)
+     emails = ArrayField(CIEmailField(), default=[])

现在,我似乎可以通过使用实例化列表设置测试数据库来做一些骇人听闻的事情,然后将我的代码切换回可调用对象,然后使用“--keepdb”运行测试。

我还有另一个模型,它使用 CharField 的 ArrayField,默认 = 列表,这似乎不是问题。一定是 CIEmail 或 CIText 字段和 ArrayField 一起导致了问题。

我正在运行 PostgreSQL 11.5,由 Visual C++ build 1914 编译,64 位

标签: djangopostgresqldjango-models

解决方案


嗯,看来我想通了

from django.contrib.postgres.operations import CITextExtension

class Migration(migrations.Migration):
    operations = [
        CITextExtension(),
        etc...,
    ]

推荐阅读