gpt4 book ai didi

python - Django 搜索多个过滤器

转载 作者:太空狗 更新时间:2023-10-29 22:23:54 26 4
gpt4 key购买 nike

假设我有一个模型

模型.py

class user:
name = models.CharField(max_length=25)

class job:
job_name = models.CharField(max_length=25)

class user_job:
user = models.ForeignKey('user')
job = models.ForeignKey('job')

表单.py

 jobs = (
('0', 'a'),
('1', 'b'),
('2', 'c'),
)

class searchForm:
box = forms.ModelMultipleChoiceField(
choices = jobs,
widget = forms.CheckboxSelectMultiple(),
label = 'Search',
)

我可以搜索拥有工作“a”的用户

user_job.objects.filter(job__exact = 'a') ...

我试着像这样搜索同时拥有工作“a”和工作“c”的用户

search_q = user_job.objects.filter(job__exact = 'a')
search_q = search_q.filter(job__exact = 'c')

但我得到所有拥有工作“a”工作“c”的用户,我需要所有拥有两者工作的用户。

有没有一种方法可以通过 Django 过滤它,或者我是否需要过滤一个作业然后遍历结果并检查第二个作业?

最佳答案

您可能会发现从User 模型进行搜索会更容易,因为您需要的是拥有两个职位的Users 的列表。 Django 会自动在您的模型上设置属性,使您可以从模型实例和数据库查询中访问相关模型。

假设您像这样设置模型:

from django.db import models

class User(models.Model):
name = models.CharField(max_length=25)

def __repr__(self):
return '<User: %s>' % self.name

class Job(models.Model):
name = models.CharField(max_length=25)

def __repr__(self):
return '<Job: %s>' % self.name

class UserJob(models.Model):
user = models.ForeignKey(User)
job = models.ForeignKey(Job)

def __repr__(self):
return '<UserJob: %s %s>' % (self.user.name, self.job.name)

并按如下方式填充它:

u1 = User.objects.create(name='u1')
u2 = User.objects.create(name='u2')
u3 = User.objects.create(name='u3')

a = Job.objects.create(name='a')
b = Job.objects.create(name='b')
c = Job.objects.create(name='c')

UserJob.objects.create(user=u1, job=a)
UserJob.objects.create(user=u2, job=a)
UserJob.objects.create(user=u2, job=b)
UserJob.objects.create(user=u3, job=a)
UserJob.objects.create(user=u3, job=c)

以下查询将返回用户 3,这是唯一同时拥有“工作 a”和“工作 c”的用户:

u = User.objects.filter(userjob__job=a).filter(userjob__job=c)

(或者,如果您更喜欢通过名称而不是作业实例来引用作业):

u = User.objects.filter(userjob__job__name='a').filter(userjob__job__name='c')

您可以看到 Django 如何允许您使用双下划线符号将相关字段从 User 模型遍历到 UserJob 模型(关于此的 Django 文档是这里:http://docs.djangoproject.com/en/1.2/topics/db/queries/#lookups-that-span-relationships .

一旦您取回了 User 对象,您就可以使用 Django 添加到模型中的关系属性类似地访问 UserJob 实例:

u = User.objects.filter(userjob__job__name='a').filter(userjob__job__name='c')
jobs = u.userjob_set.all()

关于python - Django 搜索多个过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com