django - 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 位
解决方案
嗯,看来我想通了
from django.contrib.postgres.operations import CITextExtension
class Migration(migrations.Migration):
operations = [
CITextExtension(),
etc...,
]
推荐阅读
- javascript - 如果单击取消按钮,如何使 Javascript“确认()”取消对新页面的请求?
- java - 如何在 json-binding (java ee 8) 中编写将空值转换为“”的反序列化器?
- node.js - 在 Heroku 上部署应用程序时如何修复 H20 错误?
- asp.net - 如何使用 devexpress 在弹出窗口中获取清单的选定值
- apache-kafka - Kafka 服务器 - 在 JAAS 中找不到“KafkaServer”
- javascript - 在添加到 javascript 数组之前检查重复项
- excel - SSIS:以编程方式根据 Web 查询结果创建新的 Excel 文件 - 如何保存 Web 查询表名称?
- javascript - 在 Firestore 中设置/添加操作后返回文档数据
- c# - 始终提示用户在应用程序启动时选择一个帐户
- xml - 获取 XSLT 中子节点的值