Как включить множество полей в полнотекстовый поиск postgres в django - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь выполнить полнотекстовый поиск в 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, профиль, улица "

Как я могу включить это в свой поиск?

...