我正在编写一个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,但是您不得不自己维护验证逻辑.
标签:postgresql,python,django 来源: https://codeday.me/bug/20191210/2101336.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。