如何在django中的postgres全文搜索中包含多个字段
我正在尝试使用这些模型在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
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字段(并单独循环)。