如何在django中的postgres全文搜索中包含多个字段

如何在django中的postgres全文搜索中包含多个字段,django,postgresql,orm,django-queryset,Django,Postgresql,Orm,Django Queryset,我正在尝试使用这些模型在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.CharFi

我正在尝试使用这些模型在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,以便能够返回匹配模式的结果

我曾经尝试过像这样添加profile_uumods

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
但我得到了错误“无法将关键字'mods'解析到字段中。选项有:城市、描述、id、lat、lng、姓名、电话、从业者、从业者id、个人资料、街道”


我如何才能在搜索中包含这些内容?

您是否无法将
配置文件\uuu mods\uu名称添加到
搜索向量中
,或者您无法在结果列表中返回值本身?我真的不明白您试图对
结果列表做什么。如果不使用
values\u list(…)
而使用
values()
可以直接得到想要的结果,而不必使用
list\u结果
函数。请注意,相关的MOD本身就是一个查询,因此不能将它们包含在
values()
values\u list
中。您必须使用单独的查询来获取它们,例如
modulations.objects.filter(profile\uuuu clinics\uuuu in=results)
。当我使用values()时,我会得到错误;“太多的值无法解包”。不管是哪种方式,就我需要的结果列表而言,我真正的问题在于搜索功能,正如你所说,我可能需要运行另一个查询。我将尝试一下,谢谢如果您尝试在其中放入m2m字段,您会得到“太多的值无法解包”(而且您还可以从
值\u list()
中得到它)。但是是的,您需要单独查询m2m字段(并单独循环)。