如何在Django 1.11中做到与Django 2.2的“ overlap”关键字等效?

时间:2019-05-22 10:06:04

标签: django postgresql django-models django-views django-orm

假设我有一个模型“书籍” ,其中有一个名为“ locations_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 个答案:

答案 0 :(得分:1)

  

由于Django 1.1(Sic)没有重叠功能,我该怎么做呢?

一个__overlap lookup [Django-1.10-doc]。自起,它甚至已经具有此功能,例如,请参见documentation [Django-1.8-doc]source code [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 ings列表。