Конвертировать необработанный SQL в код Django ORM, возможно - PullRequest
1 голос
/ 18 октября 2019

Можно ли выполнить что-то подобное только с 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 Спасибо

1 Ответ

2 голосов
/ 18 октября 2019

Класс SearchVector использует 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 сразу, а не через фильтр.

...