在Django中测试全文搜索触发器
我在Django项目中添加了一个搜索引擎,因此在几个模型上设置了SearchVectorFields,并使用自定义触发器 我想对我的在Django中测试全文搜索触发器,django,postgresql,unit-testing,full-text-search,django-queryset,Django,Postgresql,Unit Testing,Full Text Search,Django Queryset,我在Django项目中添加了一个搜索引擎,因此在几个模型上设置了SearchVectorFields,并使用自定义触发器 我想对我的TSVECTOR类型的列进行单元测试,以确保在模型实例更改时更新 但是,我找不到任何关于如何测试SearchVectorField内容的信息。。。我无法将my_document.search与SearchVector(Value(“document content”))或类似内容进行比较,因为前者看起来像字符串,而后者则是对象 TL;DR 更准确地说,对于模型: f
TSVECTOR
类型的列进行单元测试,以确保在模型实例更改时更新
但是,我找不到任何关于如何测试SearchVectorField内容的信息。。。我无法将my_document.search
与SearchVector(Value(“document content”))
或类似内容进行比较,因为前者看起来像字符串,而后者则是对象
TL;DR
更准确地说,对于模型:
from django.db import models
class Document(models.Model):
...
content = TextField()
search = SearchVectorField()
并触发:
-- create trigger function
CREATE OR REPLACE FUNCTION search_trigger() RETURNS trigger AS $$
begin
NEW.search := to_tsvector(COALESCE(NEW.content, ''))
return NEW;
end
$$ LANGUAGE plpgsql;
-- add trigger on insert
DROP TRIGGER IF EXISTS search_trigger ON myapp_document;
CREATE TRIGGER search_trigger
BEFORE INSERT
ON myapp_document
FOR EACH ROW
EXECUTE PROCEDURE search_trigger();
-- add trigger on update
DROP TRIGGER IF EXISTS search_trigger_update ON myapp_document;
CREATE TRIGGER search_trigger_update
BEFORE UPDATE OF content
ON myapp_document
FOR EACH ROW
WHEN (OLD.content IS DISTINCT FROM NEW.content)
EXECUTE PROCEDURE search_trigger();
如何测试在创建新的文档
实例时,其搜索
字段是否填充了正确的值?更新现有文档
实例时遇到了相同的问题,但答案应该非常相似
谢谢你的提示;) 我认为您可以比较SearchVectorField值的字符串表示形式:
from django.test import TestCase
from .models import Document
class DocumentTest(TestCase):
def setUp(self):
Document.objects.create(content='Pizza Recipes')
def test_document_search(self):
document_list = list(Document.objects.values_list('search', flat=True))
search_list = ["'pizza':1 'recip':2"]
self.assertSequenceEqual(document_list, search_list)
但是你必须手动构建你的
搜索列表
。。。我想避免这种情况,因为1)我在模拟所有东西->我需要停止模拟这些测试的对象,或者在给定输入的情况下实现一个构建搜索列表的函数2)我需要更准确地知道我期望的确切结果,例如搜索反映内容的内容,但是使用上述方法,我需要使用PostgreSQL来了解搜索的预期值,因为在Python中实现搜索向量的创建是低效和冗余的。通常我只处理测试中的值,以便与我预期的比较值进行比较,它只起作用,尝试一下,如果它对你也有用,就报告一下。您上次指定的需求不在您的问题中,如果您想要一个具体的答案,我建议您在主要问题中添加您上次评论的内容。如果您像我一样模拟测试中的所有内容,请将Document.objects.values\u list('search',flat=True)
与[item.search\u vector用于Document.objects.annotate(search\u vector=SearchVector('content',config='yourconfig'))中的项目]