将 Raw SQL 转换为 Django ORM 代码,可能性
Convert Raw SQL to Django ORM code , possibility
是否可以仅使用 Django ORM 执行类似的操作?
with connection.cursor() as cursor:
cursor.execute(
"""SELECT word FROM ts_stat(
'SELECT to_tsvector(''simple'', description) FROM api_product');""",
#[source, ]
)
words_in_product_model = frozenset(
more_itertools.one(word) for word in cursor.fetchall()
db-Postgres 11
谢谢
SearchVector class 确实使用了 to_tsvector
但我认为 ts_stat
不可用。
最初查看您的问题时,我完全忽略了 ts_stat
采用字符串而不是常规结果这一事实。这显着改变了实现方式,我不确定实现它的最佳方式是什么......但我会给你一个简单的技巧来解决它,使用查询集上的 raw
方法。
from django.db import models
class TsStat(models.Model):
word = models.CharField(max_length=256)
ndoc = models.PositiveIntegerField()
nentry = models.PositiveIntegerField()
class Meta:
managed: False
vector_query = models.ApiProduct.objects.annotate(
search=Func(Value('simple'), 'description', function='to_tsvector'),
).values('search')
results = TsStat.objects.raw('SELECT * FROM ts_stat(%s)' % vector_query.query)
但这显然未经测试,语法可能略有不同,您可能必须立即包含 SearchVector
而不是通过过滤器。
是否可以仅使用 Django ORM 执行类似的操作?
with connection.cursor() as cursor:
cursor.execute(
"""SELECT word FROM ts_stat(
'SELECT to_tsvector(''simple'', description) FROM api_product');""",
#[source, ]
)
words_in_product_model = frozenset(
more_itertools.one(word) for word in cursor.fetchall()
db-Postgres 11 谢谢
SearchVector class 确实使用了 to_tsvector
但我认为 ts_stat
不可用。
最初查看您的问题时,我完全忽略了 ts_stat
采用字符串而不是常规结果这一事实。这显着改变了实现方式,我不确定实现它的最佳方式是什么......但我会给你一个简单的技巧来解决它,使用查询集上的 raw
方法。
from django.db import models
class TsStat(models.Model):
word = models.CharField(max_length=256)
ndoc = models.PositiveIntegerField()
nentry = models.PositiveIntegerField()
class Meta:
managed: False
vector_query = models.ApiProduct.objects.annotate(
search=Func(Value('simple'), 'description', function='to_tsvector'),
).values('search')
results = TsStat.objects.raw('SELECT * FROM ts_stat(%s)' % vector_query.query)
但这显然未经测试,语法可能略有不同,您可能必须立即包含 SearchVector
而不是通过过滤器。