Django-查询列表中的任何项位于多个字段中的任何对象

Django-查询列表中的任何项位于多个字段中的任何对象,django,model,get,many-to-many,Django,Model,Get,Many To Many,我在Django有一个模型,它有一个名为“accepted_insurance”的许多字段。我有一个表单,它提交一个get请求,其中包含一个包含保险提供商列表的查询字符串。我正在尝试编写一个查询,该查询表示“如果查询字符串列表中的任何项位于多个字段列表中,则过滤这些对象。”。有Django查询的快捷方式吗?我试图使用“contains”,但是我得到了一个类型错误,相关字段得到了一个无效的查找,我确信这只会说明列表是否包含该列表 models.py class Provider(models.Mo

我在Django有一个模型,它有一个名为“accepted_insurance”的许多字段。我有一个表单,它提交一个get请求,其中包含一个包含保险提供商列表的查询字符串。我正在尝试编写一个查询,该查询表示“如果查询字符串列表中的任何项位于多个字段列表中,则过滤这些对象。”。有Django查询的快捷方式吗?我试图使用“contains”,但是我得到了一个类型错误,相关字段得到了一个无效的查找,我确信这只会说明列表是否包含该列表

models.py

class Provider(models.Model):
    title = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    middle_name = models.CharField(max_length=255, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)
    email = models.EmailField(null=True, blank=True)
    phone = models.CharField(max_length=40, null=True, blank=True)
    extension = models.CharField(max_length=10, null=True, blank=True)
    company = models.CharField(max_length=255, null=True, blank=True)
    age = models.IntegerField(null=True, blank=True)
    about = models.TextField(default='', null=True, blank=True)
    position = models.CharField(max_length=255, null=True, blank=True)

    cost_per_session = models.CharField(max_length=255, null=True, blank=True)
    accepts_insurance = models.BooleanField(default=False)
    accepted_insurance = models.ManyToManyField('Insurance', blank=True)
    payment_methods = models.ManyToManyField('PaymentMethod', blank=True)
请求

http://localhost:8004/directory/?search=timothy&insurance=cigna,aetna,optum_health,united_behavioral,blue_cross_blue_shield

<QueryDict: {'insurance': ['cigna,aetna,optum_health,united_behavioral,blue_cross_blue_shield'], 'search': ['timothy']}>

\u in
是您需要的操作员

但是,您还有一些其他问题。首先,不需要通过querydict进行循环;这是一个dict,您可以通过密钥访问它

其次,您当前只有一个字符串;您需要使用
split(',')
方法将其拆分为字符串列表

第三,您需要实际根据保险模型上的字段进行过滤——可能它有一个“name”字段

因此:


\u in
是您需要的操作员

但是,您还有一些其他问题。首先,不需要通过querydict进行循环;这是一个dict,您可以通过密钥访问它

其次,您当前只有一个字符串;您需要使用
split(',')
方法将其拆分为字符串列表

第三,您需要实际根据保险模型上的字段进行过滤——可能它有一个“name”字段

因此:


因此,如果接受的保险有两个标题为“蓝十字蓝盾”和“信诺”的对象,它会尝试查看这两个标题是否都在保险字典中吗?不会。它将匹配任何在接受的保险字段中具有列表中任何名称的提供商。太棒了,谢谢Daniel!有些查询快捷方式一开始听起来有点违反直觉,但如果它起作用,它就会起作用。请注意,如果提供程序匹配列表中的多个项目,它可能会在输出中出现两次;将
.distinct()
添加到查询中以防止出现这种情况。是否不区分大小写?因此,如果接受的保险有两个标题为“蓝十字蓝盾”和“信诺”的对象,它会尝试查看这两个标题是否都在保险字典中吗?不会。它会匹配任何在其接受的保险字段中有任何列表中名称的提供商。太棒了,谢谢Daniel!有些查询快捷方式一开始听起来有点违反直觉,但如果它起作用,它就会起作用。请注意,如果提供程序匹配列表中的多个项目,它可能会在输出中出现两次;将
.distinct()
添加到查询以防止出现这种情况。是否不区分大小写?
for param in request.GET:
    if param.lower() == 'insurance':
        all_providers = all_providers.filter(accepted_insurance__contains=param)
insurance = request.GET.get('insurance', '').split(',')
all_providers = all_providers.filter(accepted_insurance__name__in=insurance)