2010-12-15 5 views
6

Допустим, у меня есть модельДжанго поиск несколько фильтров

models.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') 

forms.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') ... 

Я пытался найти пользователей, которые имеют как работу «а» и работа «с», как так

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

, но я получаю все пользователи, имеющие работу «а» или работа «с», и мне нужны все пользователи, у которых есть и вакансий.

Есть ли способ, по которому я могу отфильтровать его через Django, или мне нужно отфильтровать на одном задании, а затем перебрать результаты и проверить вторую работу?

ответ

9

с помощью функции поиска по имени User. Вам будет удобнее поиск по модели 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, который является единственным пользователем, который имеет как «Работа» и «Работа с»:

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

(или, если вы предпочитаете, чтобы ссылаться на работу по имени, а не J об-экземпляре):

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

Вы можете увидеть, как Джанго это позволяют пройти соответствующие поля из User модели в UserJob модели с двойным подчеркиванием нотации (Документы Джанго на это здесь: http://docs.djangoproject.com/en/1.2/topics/db/queries/#lookups-that-span-relationships.

После того, как вы получите User объект обратно, вы можете так же получить доступ к экземплярам UserJob, используя свойства отношений, которые Django добавляет к модели:

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

хмм, это работает, я не совсем понимаю как, но это просто works: D ... почему я смотрю в User.objects.filter? а не в UserJob.objects.filter? если вы можете ... можете ли вы дать мне немного sql, как это будет выглядеть ... в любом случае, это очень то, что мне нужно ... thx для вашего времени и GL – void 2010-12-15 15:50:28

Смежные вопросы