Я пытаюсь выполнить полнотекстовый поиск в postgres, используя эти модели
class CustomUser(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
password2 = models.CharField(max_length=128)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
active = models.BooleanField(default=True) # Able to login
practitioner = models.BooleanField(default=False) # has access to a clinc
admin = models.BooleanField(default=False) # superuser
staff = models.BooleanField(default=False) # staff
timestamp = models.DateTimeField(auto_now_add=True)
class Modalities(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Profile(models.Model):
user = models.OneToOneField(User,
related_name='prof_user',
on_delete=models.CASCADE)
bio = models.TextField(max_length=5000)
mods = models.ManyToManyField(Modalities)
phone = PhoneNumberField()
clinics = models.ManyToManyField(Clinic)
personnummer = models.CharField(max_length=12)
street = models.CharField(max_length=50)
city = models.CharField(max_length=50)
consent = models.BooleanField()
class Clinic(models.Model):
practitioner = models.OneToOneField(User,
related_name='prac_user',
on_delete=models.CASCADE)
lat = models.FloatField(null=True, blank=True)
lng = models.FloatField(null=True, blank=True)
name = models.CharField(max_length=128, )
phone = PhoneNumberField()
description = models.TextField(max_length=5000)
street = models.CharField(max_length=128, )
city = models.CharField(max_length=128, )```
Пока что я могу вернуть результаты поиска с
def search(request):
search_vector = SearchVector('practitioner__first_name', 'name',
'description', 'street', 'city')
results = Clinic.objects.annotate(search=search_vector).filter(
search='Göteborg').values_list('name',
'street',
'city',
'lat',
'lng',
'pk',
flat=False)
def list_of_results(results):
key_list = ['name', 'street', 'city', 'lat', 'lng', 'clinic_id']
r_list = []
object = []
for p in results:
r_list.append([p[0], p[1], p[2], p[3], p[4], p[5]])
for array in r_list:
object.append(dict(zip(key_list, array)))
return object
search_result = list_of_results(results)
Мне также хотелось бы чтобы иметь возможность включить Profile.mods в search_vector, чтобы иметь возможность возвращать результаты для соответствующих модальностей.
Я попытался добавить profile__mods, например, так:
def list_of_results(results):
key_list = [
'name', 'street', 'mods', 'city', 'lat', 'lng', 'clinic_id'
]
r_list = []
object = []
for p in results:
r_list.append([p[0], p[1], p[2], p[3], p[4], p[5], p[6]])
for array in r_list:
object.append(dict(zip(key_list, array)))
return object
Но я получаю ошибку "Не могу преобразовать ключевое слово «моды» в поле. Варианты: город, описание, идентификатор, лат, lng, имя, телефон, практикующий специалист, Practitioner_id, профиль, улица "
Как я могу включить это в свой поиск?