Я пишу приложение 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, мы столкнулись с известной проблемой в 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 или написания хакерской логики, или если бы существовал совершенно другой подход, который мог бы удовлетворить мое требование.
Заранее спасибо!
Редактировать: временное решение
На данный момент (в качестве промежуточного исправления) я решил перейти со значением часового для следующего прыжка:
В модели:
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
объектов вне административного портала работает как задумано, поэтому я сохранил аргумент null=True
в поле nexthop
. Единственное место, где 255.255.255.255 когда-либо будет установлен в качестве следующего перехода, будет через портал администратора, поэтому я решил, что перегрузка save()
для постоянной замены часового на None
даст мне желаемый конечный результат, и это на самом деле не чувствую себя слишком взломанным.
Спасибо за ваш вклад в это!