Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中测试全文搜索触发器_Django_Postgresql_Unit Testing_Full Text Search_Django Queryset - Fatal编程技术网

在Django中测试全文搜索触发器

在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

我在Django项目中添加了一个搜索引擎,因此在几个模型上设置了SearchVectorFields,并使用自定义触发器

我想对我的
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'))中的项目]