Django覆盖现有的db后端

时间:2014-03-21 13:51:20

标签: python django postgresql inet

我正在使用Python 2.7.5,Django 1.5.4和PostgreSQL 9.3。我的模型对象中有一个INET字段。字段定义就像;

class INETField(_NetAddressField):
    description = "PostgreSQL INET field"
    max_length = 39
    __metaclass__ = models.SubfieldBase

    def db_type(self, connection):
        return 'inet'

    def python_type(self):
        return IPNetwork

    def form_class(self):
        return InetAddressFormField

我们需要知道的是,字段类型为inet。到目前为止,一切都很完美。

但是当我尝试按inet field进行过滤时,虽然必须有一些结果,但结果中没有过滤结果。所以我查看了Django生成的查询。就像;

SELECT
    ......
    ......
FROM "ip_prefix"
WHERE (HOST("ip_prefix"."prefix") :: TEXT LIKE '%0.0.0.0/0%' AND "ip_prefix"."vrf_id" = 1 AND "ip_prefix"."afi" = '4')
ORDER BY "ip_prefix"."prefix" ASC

所以我看到了PostgreSQL的HOST方法给ip的主机部分而不是netmask(0.0.0.0)的问题。所以我需要找到生成零件的位置。我搜索了一下,然后在postgresql_psycopg2/operations找到了它。部分是;

def field_cast_sql(self, db_type):
    if db_type == 'inet':
        return 'HOST(%s)'
    return '%s'

我的问题不是关于 inet字段或特定内容,例如ips,网络等。我的问题是,"有没有办法覆盖某些部分db backend中的Django现有def field_cast_sql(self, db_type): if db_type == 'inet': return 'NETWORK(%s)' return '%s' 而没有图书馆?#34;。如果我能做到这一点,我可以做到这一点;

{{1}}

0 个答案:

没有答案