Как правильно запросить ManyToManyField для всех объектов в списке (или другой ManyToManyField)?

Вы можете, конечно, самокрутка с существующими стандартными библиотеками на любом уровне от сокетов до тонкой настройки urllib.

http://pycurl.sourceforge.net/

"PyCurl является интерфейсом Python к libcurl".

"libcurl свободная и простая в использовании клиентская библиотека передачи URL... поддержки... HTTP, ПОМЕЩЕННЫЙ"

"Основной недостаток с PycURL, - то, что это - относительный тонкий слой по libcurl без любой из тех хороших иерархий классов Pythonic. Это означает, что имеет несколько крутую кривую обучения, если Вы не уже знакомы с API libcurl C".

16
задан Kevin Brown 24 December 2014 в 01:31
поделиться

2 ответа

Другая идея

Хорошо, я думаю, мне следовало добавить это к другому ответу, но когда я начал, казалось, что это будет другой направление хаха

Не нужно повторять:

person_specialties = person.specialties.values_list('pk', flat=True)

non_specialties = Specialties.objects.exclude(pk__in=person_specialties)

jobs = Job.objects.exclude(required_specialties__in=non_specialties)

примечание : Я не знаю точно, насколько это быстро. Возможно, вам будет лучше с моими другими предложениями.
Также: этот код не протестирован

12
ответ дан 30 November 2019 в 22:43
поделиться

I think you should look at using values_list to get the person's specialties

Replace:

[s.name for s in person.specialties]

with:

person.specialties.values_list('name', flat=True)

That will give you a plain list (ie. ['spec1', 'spec2', ...]) which you can use again. And the sql query used in the bg will also be faster because it will only select 'name' instead of doing a select * to populate the ORM objects

You might also get a speed improvement by filtering jobs that the person definately can NOT perform:

so replace:

jobs = Job.objects.all()

with (2 queries - works for django 1.0+)

person_specialties = person.specialties.values_list('id', flat=True)
jobs = Job.objects.filter(required_specialties__id__in=person_specialties)

or with (1 query? - works for django1.1+)

jobs = Job.objects.filter(required_specialties__in=person.specialties.all())

You may also get an improvement by using select_related() on your jobs/person queries (since they have a foreign key that you're using)

4
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: