首页 > 解决方案 > 使用 django 的 PostgreSQL IP inet 比较

问题描述

在我的 PostgreSQL 数据库中,我有一个网络设备表。

我正在构建一个必须与该表交互的 django 应用程序。我正在使用带有 .get() 和 .filter() 方法的模型,但我不确定如何处理以下查询:

select * from my_table where ip << inet '10.93.1/24'

这应该得到类似的记录10.93.1.*,但不是10.93.13.*,所以我不能只使用:

items = MyTable.objects.filter(ip__startswith='10.93.1')

此查询的 django 等效项是什么?

标签: djangopostgresqldjango-models

解决方案


我找到了一个简单的解决方案:filter我正在使用另一种QuerySet方法而不是extra.

所以,这是我现在的代码:

objList = MyTable.objects.extra(where=["ip << inet '{}'".format(ip)])

注意:方法的where参数extra需要一个列表。然后它将列表中的每个元素视为一个条件,并将它们与AND. 所以,只传递一个字符串:

objList = MyTable.objects.extra(where="ip << inet '{}'".format(ip))

将导致extra将此字符串视为字符列表,这将导致查询:

...WHERE (i) AND (p) AND ( ) AND (<) AND (<) AND ( ) AND (i) AND (n) AND (e) AND (t) AND ( ) AND (') AND (1) AND (0) AND (.) AND (9) AND (3) AND (.) AND (1) AND (/) AND (2) AND (4) AND (')

推荐阅读