Как сделать эквивалент «перекрывающегося» ключевого слова Django 2.2 в Django 1.11? - PullRequest
0 голосов
/ 22 мая 2019

Предположим, у меня есть модель "Книги" , которая имеет поле с именем "location_available" . В этом поле хранится список мест, в которых доступна книга. Теперь у меня есть query_list = ['US', 'Germany', 'Italy'] .

Чтобы найти все книги, которые доступны в любом из этих мест, я бы сделал в Django 2.2 такой:

Books.objects.filter(locations_available__overlap=query_list)

Поскольку в Django 1.1 не было функции перекрытия, как бы я там делал такую ​​же функциональность?

>>> Books.objects.create(name='X', locations=['India', 'Japan'])
>>> Books.objects.create(name='Y', locations=['US', 'Korea'])
>>> Books.objects.create(name='Z', locations=['Italy', 'Germany'])
>>> Books.objects.create(name='A', locations=['US', 'Germany', Italy])

С учетом приведенных выше данных должны быть возвращены следующие данные:

name='Y', locations=['US', 'Korea']

name='Z', locations=['Italy', 'Germany']

name='A', locations=['US', 'Germany', 'Italy']

Обратите внимание, что книга с name = 'X' не возвращается, поскольку она не перекрывается ни с одним из местоположений в query_list.

Проверьте это для более подробной информации: https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/fields/#overlap

1 Ответ

1 голос
/ 22 мая 2019

Так как Django 1.1 (Sic) не имел функции перекрытия, как бы я там делал такую ​​же функциональность?

имеет и __overlap поиск [Django-1.10-doc] . Он даже уже имеет эту функцию начиная с , см., Например, документацию [Django-1.8-doc] и исходный код [GitHub] .

Документация ясно демонстрирует, как это работает:

>>> Post.objects.create(name='First post', tags=['thoughts', 'django'])
>>> Post.objects.create(name='Second post', tags=['thoughts'])
>>> Post.objects.create(name='Third post', tags=['tutorial', 'django'])

>>> Post.objects.filter(tags__overlap=['thoughts'])
[<Post: First post>, <Post: Second post>]

>>> Post.objects.filter(tags__overlap=['thoughts', 'tutorial'])
[<Post: First post>, <Post: Second post>, <Post: Third post>]

Таким образом, представляется, что ваш locations_available является , а не ArrayField((models.CharField(...), ...), или ваш query_list является не списком str звонков.

...