Проверьте, является ли ненулевое поле пустым (Django) - PullRequest
3 голосов
/ 20 апреля 2011

Я хотел написать такой код:

class SomeModel(models.Model):

    field = models.ForeignKey(SomeOtherModel)

    def __init__(self, *args, **kwargs):
        super(SomeModel, self).__init__(*args, **kwargs)
        if self.field is None:
            self.field = SomeOtherModel()

    ...

Однако это поднимает self.field.rel.to.DoesNotExist. Код Django очень ясен в этом:

class ReverseSingleRelatedObjectDescriptor(object):

    def __get__(self, instance, instance_type=None):

        ...

        if val is None:
            # If NULL is an allowed value, return it.
            if self.field.null:
                return None
            raise self.field.rel.to.DoesNotExist

Я почти уверен, что эта проблема поднималась раньше, однако каким-то образом я не смог найти ничего, что соответствовало бы этому конкретному сценарию использования. Очевидным обходным путем, конечно, было бы сделать поле обнуляемым, однако, насколько я понимаю, это фактически повлияет на схему базы данных, также мне нравятся проверки целостности, предлагаемые Django. Еще один способ - поймать исключение и обработать его соответствующим образом. Однако это добавляет много стандартного кода. Особенно, когда таких полей несколько (отдельный блок try...except для каждого из них - теперь это безобразно). Что бы вы предложили?

РЕДАКТИРОВАТЬ: Еще одна вещь - я мог бы использовать initial однако это довольно ограничено, когда речь идет о внешних ключах. Я не всегда знаю, какой тип дефолта я хотел бы иметь в момент создания. Однако я буду знать это на этапе инициализации. Более того, оно может зависеть от значений других полей.

Ответы [ 2 ]

10 голосов
/ 20 апреля 2011

Проверьте, имеет ли он установленный атрибут -

if hasattr(self, 'field', False)
0 голосов
/ 20 апреля 2011

правильный способ ссылки на поле в форме выглядит так:
self.fields['myfield']
так что, в вашем случае, нулевая проверка должна выглядеть следующим образом
self.fields['myfield'].value is None

с другой стороны, не используйте зарезервированные / близко к зарезервированным словам, таким как 'field', для именования ваших полей.

...