我正在编写一个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] 举报,一经查实,本站将立刻删除。