过滤对象,该对象以列表中的字符串开头

时间:2019-01-28 09:18:26

标签: python django django-queryset

这是我的代码:

communeList = [
    "78",
    "95",
    "77",
    "91",
    "92",
    "93",
    "94",
    "75",
]

commune_list_1 = list(Commune.objects.all())
commune_list = []
for c in commune_list_1 :
       if c.codePostal[0:2] not in communeList :
            commune_list.append([c])

CodePostal是一个有6个字符的charfield,我想通过查询返回以列表communeList的元素开头(前两个字符)的所有codepostal。

致谢

2 个答案:

答案 0 :(得分:2)

您可以使用__startswith

例如:

from django.db.models import Q

communeList = [
    "78",
    "95",
    "77",
    "91",
    "92",
    "93",
    "94",
    "75",
]

que = Q()
for i in communeList:
    que |= Q(codePostal__startswith=i)

Commune.objects.filter(que)

答案 1 :(得分:1)

您的模型不适用于此查询-您需要将邮政编码分为两部分(部门代码-2到3个字符,具体取决于它是否在DOMS-TOMS中-以及“局分布” “剩余字符的ID)。然后,您可以查询部门代码:

commune_list = Commune.objects.filter(department_code__in=communeList)

或者,也可以一起使用“ startswith”查询,或进行比较,参见Rakesh的答案,但这并不是非常有效,特别是如果您的数据库中有36000个法国公社。一次性脚本是可以的,但是如果在部门列表中进行过滤是应用程序的常用功能,则您肯定希望更改架构。

请注意,由于历史原因,this answer也不是城市标识符(您需要使用insee代码)。

-完全无关,但是-您的命名前后不一致(mixedCase + all_lower),误导性(您的三个变量基本上都被命名为“公社列表”-使得真的很难记住哪个是哪个),并最终是错误的(t​​he第一个列表是部门代码列表,而不是公社列表)。提示:集合的良好命名约定是复数形式(“ une commune” =>“ des communes”)。