Поиск по полю массива в Django?
У меня есть поле массива с именем 'hashtags' в game.models. Я хочу сделать поиск по названию, а также по хэштегам в строке поиска.
object_list = Oyunlar.objects.annotate(search=SearchVector('title','hashtags')).filter(search=query).order_by('-click_count')
Это моя модель:
class Oyunlar(models.Model):
game_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=10000)
youtube_link=models.URLField(blank=True,null=True)
video_aciklamasi=models.TextField(blank=True,null=True)
platform = models.CharField(max_length=10)
image = models.CharField(max_length=255, blank=True, null=True)
release_date = models.DateField(blank=True, null=True)
click_count = models.IntegerField(default=0)
categories=models.ManyToManyField(Kategoriler,through='OyunlarKategoriler')
base_price=models.DecimalField(default=0,max_digits=65535, decimal_places=2)
big_discount=models.BooleanField(default=False)
en_ucuz = models.DecimalField(default=0,max_digits=65535, decimal_places=2)
popularite = models.IntegerField(blank=True, null=True,default=0)
discount_rate = models.DecimalField(default=0,max_digits=65535, decimal_places=2)
title_edit = models.CharField(max_length=500, blank=True, null=True)
description = models.CharField(max_length=100000, blank=True, null=True)
steam_id = models.CharField(max_length=1000, blank=True, null=True)
metacritic = models.FloatField(blank=True, null=True)
recommendation = models.BigIntegerField(blank=True, null=True)
full_game = models.BooleanField(blank=True, null=True)
age = models.CharField(max_length=500, blank=True, null=True)
minimum = models.CharField(max_length=10000, blank=True, null=True)
recommended = models.CharField(max_length=10000, blank=True, null=True)
developer = models.CharField(max_length=500, blank=True, null=True)
publisher = models.CharField(max_length=500, blank=True, null=True)
oyun_foto = ArrayField(models.CharField(max_length=10000, blank=True, null=True),blank=True,null=True) # This field type is a guess.
windows = models.BooleanField(blank=True, null=True)
mac = models.BooleanField(blank=True, null=True)
linux = models.BooleanField(blank=True, null=True)
gamehunterz_yorumu = models.CharField(max_length=100000, blank=True, null=True)
slugyap = AutoSlugField(default=None,null=True,populate_from='title_and_id',editable=True,max_length=10000)
platformurl=AutoSlugField(default=None,null=True,editable=True,max_length=10000)
hashtags = ArrayField(models.CharField(max_length=500, blank=True, null=True), blank=True, null=True)
Это не работает, что я могу сделать, чтобы это заработало?
На этот вопрос был дан ответ здесь. Вы можете использовать его в запросе вместо сохранения следующим образом:
from django.db.models import F, Func, Value, Concat, CharField
object_list = Oyunlar.objects.annotate(
search=SearchVector(
Concat(
Func(F('hashtags'), Value(' '), function='array_to_string'),
Value(' '),
F('title'),
output_field=CharField()
)
)
).filter(
search=query
).order_by('-click_count')
Ps. вам нужно конкатенировать title
в search
, а также