假设我有一个模型“书籍” ,其中有一个名为“ 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
答案 0 :(得分:1)
由于Django 1.1(Sic)没有重叠功能,我该怎么做呢?
django-1.10 有一个__overlap
lookup [Django-1.10-doc]。自django-1.8起,它甚至已经具有此功能,例如,请参见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列表。