Django QuerySet筛选器在查找包含点的字符串时没有结果

2024-09-28 18:53:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定是谷歌搜索错了,还是我看不到自己的错误

我将Django3.x与postgreSQL数据库一起使用,数据库的模式为django2

我在Django中有一个模型,其中包含一个用于保存IPv4地址的字符域。是的,我知道GenericPaddressField,可能会切换到该字段

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)进行筛选,其中query是一个字符串

ip__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在过滤查询中是否存在点问题

提前谢谢


Tags: djangoip数据库trueaddressmodelsusernamesim
1条回答
网友
1楼 · 发布于 2024-09-28 18:53:45

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

正如您所说,GenericIPAddressField是存储IP的最佳选择

我不认为icontains会有什么不同,但是试试看

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

例如:IP 127.67.1.1

ip_分割=['127'、'67'、'1'、'1']

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

哈奇,但在你想出一个类似Python的方法来修复它之前,它是有效的

相关问题 更多 >