首页 > 解决方案 > 查找包含点的字符串时,Django QuerySet过滤无结果

问题描述

我不确定我是否可能在谷歌上搜索错了,或者我只是看不到我的错误。

我正在将 Django 3.x 与带有名为 django2 的模式的 postgreSQL 数据库一起使用。

我在 Django 中有一个模型,其中包含一个用于保存 IPv4 地址的 CharField。是的,我知道 GenericIPAddressField 并且可能会切换到那个。

class APN(models.Model):
    address = models.CharField(max_length=64)
    username= models.CharField(max_length=64, unique=True, primary_key=True)
    password = models.CharField(max_length=64)
    ip = models.CharField(max_length=64)
    responsible_user= models.CharField(max_length=64, null=True)
    assigned = models.BooleanField(default=False)

现在我想过滤results_apn = APN.objects.filter(ip__contains=query)wherequery是一个字符串。

过滤 QuerySetip__contains=query让我有两个观察结果:

  1. 当查找没有任何点的数字(例如 100 或 254)时,我将获得包含该特定字符串的所有 IP
  2. 当查找 IP 的一部分或完整的 IP(例如 10.171.16.14 或 17.128)时,我不会得到任何结果。

我得到了 Django 生成的查询(QuerySet.query):

SELECT "sim_apn"."address", "sim_apn"."username", "sim_apn"."password", "sim_apn"."ip", "sim_apn"."responsible_user", "sim_apn"."assigned" FROM "sim_apn" WHERE "sim_apn"."ip"::text LIKE %10.171.16.14%

如果我直接在 SQL 中使用它,那么我会得到一个结果。但是 Django 不想给我一个答案。

我是否遗漏了什么,或者 Django 在过滤器查询中的点有问题吗?

提前致谢。

标签: pythondjango-queryset

解决方案


我必须问几个明显的问题,您确定要寻找的对象吗?真的存在吗?

就像你说的,GenericIPAddressField存储IP是你最好的选择

我认为icontains不会有任何区别,但请尝试一下。

如果您需要紧急修补程序,一个hacky(不推荐)的方法是通过拆分IP,过滤所有包含第一个数字的结果,然后缩小范围并过滤第二个数字。

例如:IP 127.67.1.1

ip_split = ['127','67','1','1']

获取包含 ip_split[0] 的所有结果的查询列表,如果它们不包含其余的 ip 分数,则将其过滤掉。

哈克,但它会起作用,直到你找到一种 Pythonic 的方法来修复它。


推荐阅读