微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-Django 1.1.1:如何使用PostgreSQL存储一个空IP地址?

我正在编写一个Django应用程序,该应用程序存储具有可选路由信息的IP地址.我创建的IP模型的字段之一是nexthop(用于下一跳路由),该字段通常为空.最初我们打算使用MySQL,但现在项目要求已更改为使用Postgresql.

这是我的模型的精简版:

class IP(models.Model):
    address = models.IPAddressField()
    netmask = models.IPAddressField(default='255.255.255.255')
    nexthop = models.IPAddressField(null=True, blank=True, default=None)
    active  = models.BooleanField('is active?', default=1)

因此,对于MysqL,我没有任何问题将nexthop字段留空.但是,现在我将开发环境切换到Postgres,我们遇到了known issue in Django 1.1.1,其中空白IP地址引发了DataError

invalid input Syntax for type inet: ""
LINE 1: ...-14 13:07:29', 1, E'1.2.3.4', E'255.255.255.255', E'', true)
                                                             ^

如您所见,它炸弹是因为当列仅接受NULL时,它试图插入一个空字符串.

我非常需要能够将此字段保留为空,因为如果IP没有下一跳,则其行为会发生变化.

除了手动修改Django代码(这是我的最终选择)之外,我还考虑了将下一跳认为255.255.255.255并围绕其包装一些业务逻辑(即,如果下一跳为255.255.255.255,则视为常规路由) ),但感觉就像是骇客.

我想知道是否有任何建议可以更好地做到这一点,而这些都不需要黑客Django或编写hacky逻辑,或者是否有完全不同的方法可以完全满足我的要求.

提前致谢!

编辑:临时解决方

为了节省时间(作为插页式广告),我决定使用下一跳的哨兵值:

在模型中:

IP_NEXTHOP_SENTINEL = '255.255.255.255'
class IP(models.Model):
    nexthop = models.IPAddressField(
        null=True,
        blank=True,
        default=IP_NEXTHOP_SENTINEL,
        help_text='Use %s to indicate no next-hop' % IP_NEXTHOP_SENTINEL
    )

    def save(self, *args, **kwargs):
        ## hack for Django #5622 (http://code.djangoproject.com/ticket/5622)
        if self.nexthop and self.nexthop == IP_NEXTHOP_SENTINEL:
            self.nexthop = None

概述:

在管理门户之外创建IP对象的工作符合预期,这就是为什么我在nexthop字段上保留null = True参数的原因.唯一将255.255.255.255设置为下一跳的地方是通过管理门户,因此我决定重载save()以始终用None替换前哨会给我最终的结果,但我没有真的感觉太像黑客了.

感谢您对此的投入!

解决方法:

如果您可以说服开发人员接受其中一个补丁,那么我说您只需运行Django的补丁副本,直到补丁版本登陆.如果没有,那么按照您的建议,仅使用哨兵值就可以减轻头痛,即使这是一个hack.您可能还只是使用常规的CharField而不是IPAddressField,但是您不得不自己维护验证逻辑.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐