gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:10:51 25 4
gpt4 key购买 nike

我正在向 Django 项目添加一个搜索引擎,因此在多个模型上设置了 SearchVectorFields,并带有自定义触发器。

我想对我的 TSVECTOR 类型的列进行单元测试,以确保在模型实例发生变化时更新。

但是,我一直无法找到有关如何测试 SearchVectorField 内容的任何信息...我无法将 my_document.searchSearchVector(Value("document content")) 或类似的,因为第一个似乎是字符串,而后者是一个对象。

长话短说

更准确地说,对于模型:

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();

当我创建一个新的 Document 实例时,如何测试它的 search 字段是否填充了正确的值?更新现有 Document 实例的相同问题,但答案应该非常相似。

感谢任何提示;)

最佳答案

我认为您可以比较 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)

关于django - 在 Django 中测试全文搜索触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54967091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com