【问题标题】:Django QuerySet Filter no result when looking up a string containing a point查找包含点的字符串时,Django QuerySet过滤无结果
【发布时间】:2020-01-31 10:02:23
【问题描述】:

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

我正在使用 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) 进行过滤,其中query 是一个字符串。

过滤 ip__contains=query 上的 QuerySet 导致我有两个观察结果:

  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%

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

是我遗漏了什么还是 Django 在过滤器查询中的点有问题?

提前致谢。

【问题讨论】:

    标签: python django-queryset


    【解决方案1】:

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

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

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

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

    p>

    例如:IP 127.67.1.1

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

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

    Hacky,但在你找到一种 Pythonic 的方法来修复它之前它会起作用。

    【讨论】:

    • 是的,对象在数据库中。大约有 1200 个带有 IP 的条目。手动完成的相同查询正在返回想要的结果。然后我会尝试将字段更改为GenericIPAddressField。它应该在不久的将来在一个生产环境中运行,所以这个修补程序不是我能做到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2021-02-19
    • 2020-02-06
    相关资源
    最近更新 更多