Zapytanie o filtr Django na „krotkach” wartości dla wielu kolumn
Powiedz, że mam model:
Class Person(models.Model):
firstname = models.CharField()
lastname = models.CharField()
birthday = models.DateField()
# etc...
i mówię, że mam listę 2 imion:first_list = ['Bob', 'Rob']
Mam listę 2 nazwisk:last_list = ['Williams', 'Williamson']
. Potem, jeśli chciałbym wybrać wszystkich, których imię brzmiałofirst_list
Mógłbym biec:
Person.objects.filter(firstname__in=first_list)
a jeśli chciałbym wybrać wszystkich, których nazwisko było w środkulast_list
, Mógłbym zrobić:
Person.objects.filter(lastname__in=last_list)
Jak na razie dobrze. Jeśli chcę uruchomić oba te ograniczenia jednocześnie, to proste ...
Person.objects.filter(firstname__in=first_list, lastname__in=last_list)
Gdybym chciał zrobićor
wyszukiwanie stylu zamiastand
szukam stylu, mogę to zrobićQ
obiekty:
Person.objects.filter(Q(firstname__in=first_list) | Q(lastname__in=last_name))
Ale mam na myśli coś bardziej subtelnego. Co zrobić, jeśli chcę zwrócić zestaw zapytań zwracający określone kombinacje imion i nazwisk? To znaczy. Chcę zwrócićPerson
przedmioty, dla których(Person.firstname, Person.lastname)
jest wzip(first_names, last_names)
. To znaczy. Chcę odzyskać kogokolwiek o nazwisku Bob Williams lub Rob Williamson (ale nie nikogo o nazwisku Bob Williamson lub Rob Williams).
W moim rzeczywistym przypadku użyciafirst_list
ilast_list
obaj mieliby ~ 100 elementów.
W tej chwili muszę rozwiązać ten problem w aplikacji Django. Ale jestem też ciekawy, jak najlepiej poradzić sobie z tym w bardziej ogólnym kontekście SQL.
Dzięki! (I proszę daj mi znać, jeśli mogę coś wyjaśnić.)