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