Django 1.1.1: Как хранить пустой IP-адрес с помощью PostgreSQL? - PullRequest
3 голосов
/ 07 декабря 2009

Я пишу приложение 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 даст мне желаемый конечный результат, и это на самом деле не чувствую себя слишком взломанным.

Спасибо за ваш вклад в это!

Ответы [ 3 ]

2 голосов
/ 07 декабря 2009

Если вы можете убедить разработчиков принять одно из исправлений, я бы сказал, просто запускайте исправленную копию Django, пока исправленная версия не появится. Если нет, то, как вы и предлагали, может быть меньше головной боли просто использовать значение часового, хотя это и есть хак. Вы также можете просто использовать обычный CharField вместо IPAddressField, но тогда вы застреваете в необходимости поддерживать логику проверки самостоятельно.

1 голос
/ 07 декабря 2009

Вы пытались просто использовать blank=True для nexthop, а не blank=True и null=True? Как отмечено в Django документах :

Используйте только null = True для нестроковых полей, таких как целые, логические и даты.

0 голосов
/ 08 января 2010

А как насчет использования пустой строки в качестве стража вместо 255.255.255.255?

Поскольку администраторский сервер хранит пустое поле в виде пустой строки (когда blank=true), это решение имеет преимущество в том, что оно прозрачно для пользователя и не заставляет его использовать поддельное значение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...