python - 查找包含点的字符串时,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
让我有两个观察结果:
- 当查找没有任何点的数字(例如 100 或 254)时,我将获得包含该特定字符串的所有 IP
- 当查找 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 在过滤器查询中的点有问题吗?
提前致谢。
解决方案
我必须问几个明显的问题,您确定要寻找的对象吗?真的存在吗?
就像你说的,GenericIPAddressField
存储IP是你最好的选择
我认为icontains
不会有任何区别,但请尝试一下。
如果您需要紧急修补程序,一个hacky(不推荐)的方法是通过拆分IP,过滤所有包含第一个数字的结果,然后缩小范围并过滤第二个数字。
例如:IP 127.67.1.1
ip_split = ['127','67','1','1']
获取包含 ip_split[0] 的所有结果的查询列表,如果它们不包含其余的 ip 分数,则将其过滤掉。
哈克,但它会起作用,直到你找到一种 Pythonic 的方法来修复它。
推荐阅读
- django - ConnectionResetError 使用 fetch API 将数据传递给 Django 视图,该视图将数据发布到外部 api
- python - 在没有帮助器的情况下重写递归 python 函数会导致它停止工作
- python - 使用opencv进行连接线检测
- java - 位图工厂返回未完成的位图
- python-3.x - 使用 1 = True 和 0 = False 在带有 if 条件的 pandas 中添加新列
- c++ - 为什么函数不能识别在 main() 中创建的对象?
- python - 从外部文件读取 URL
- node.js - 使用节点 js 附加到表
- android - 当应用程序关闭时,AlarmManager 不起作用。这是为什么?
- java - 这是一个有效的十六进制值吗?