2015-11-27 5 views
2

Предположим, что у меня есть список навыков:запросов с несколькими условиями ManyToMany

skills = ['Python', 'Django', 'Java'] 

Пусть я тогда выполнить

Freelancer.object.filter(Q(skills=skills[0])) 

Оба Фрилансеры имеют этот навык, но, несмотря на запрос не является цельность их репертуара Я все еще хочу, чтобы они появились, и они будут. Выступаю:

У фрилансера есть все три умения, поэтому я хочу, чтобы он появился. Freelancer два только соответствует 2/3, поэтому я не хочу, чтобы он появлялся, но он, очевидно, будет из-за запроса. Как я могу это сделать?

Предположим, что это возможно с Q и skills - это список размеров n. Возможно ли выполнить этот запрос динамически?

# models.py 

class Freelancer(models.Model): 
    def __unicode__(self): 
     return self.first_name 

    user = models.OneToOneField(User) 
    first_name = models.CharField(max_length=128) 
    surname = models.CharField(max_length=128) 
    university = models.CharField(max_length=256) 
    biography = models.TextField(default="") 
    skills = models.ManyToManyField(Skill, blank=True) 
    profile_picture = models.ImageField(blank=True, upload_to='freelancer/images') 

    object = UserManager() 


class Skill(models.Model): 
    skill = models.TextField(primary_key=True, max_length=128) 

    def __unicode__(self): 
     return self.skill 

EDIT:

Для ясности я предоставил POST часть представления

# views.py 

    form = FilterFreelancerForm(request.POST) 
    skills = request.POST.getlist('skills_select') 

    queries = [Q(skills=s) for s in skills] 
    freelancers = Freelancer.object.filter(*queries) 
+0

Можете ли вы поместить свое определение класса Freelance, наиболее важно, как навыки co Определяется lumn? – Maciek

+0

Я исправил свой пост. – Nanor

ответ

1

Вы должны вызвать filter несколько раз, потому что внутри одного фильтра, может быть только один JOINSkills стол. Источник: https://docs.djangoproject.com/en/1.8/topics/db/queries/#spanning-multi-valued-relationships

Так почему бы не попробовать это так:

freelancers = Freelancer.objects.all() 

for skill in skills: 
    freelancers = freelancers.filter(skills__skill=skill) 

print(list(freelancers)) 
1

Вы должны использовать & (AND) вместо | (OR)

skills = ['Python', 'Django', 'Java'] 
queries = [Q(skill=s) for s in skills] 
Freelancer.Object.filter(*queries) 

или

Freelancer.Object.filter(Q(skills=skills[0]) & Q(skills=skills[1]) & Q(skills=skills[3]))