Необязательный внешний ключ с Django? - PullRequest
0 голосов
/ 08 сентября 2010

В моем models.py я хочу иметь дополнительное поле для внешнего ключа. Я попробовал это:

field = models.ForeignKey(MyModel, null=True, blank=True, default=None)

Я получаю эту ошибку:

model.mymodel_id may not be NULL

Я использую sqlite. В случае, если это полезно, вот место исключения:

/usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py in execute, line 200

Ответы [ 4 ]

6 голосов
/ 08 сентября 2010

Если ранее он не был нулевым, и вы синхронизировали его до этого, повторная синхронизация не изменит его. Либо удалите таблицу, используйте инструмент миграции, например, South, либо измените столбец в SQL напрямую.

1 голос
/ 08 сентября 2010

Я считаю, что это должно быть как null=True, так и blank=True.

0 голосов
/ 05 ноября 2010

У меня та же проблема, и она была детализирована до самого процесса создания таблицы (поскольку проблемы возникают и при выполнении тестов.)

Для такой модели:

class MyModel(models.Model):
    owner = models.ForeignKey(User, null=True, blank=True)

сгенерированный sql (с ./manage.py sql):

CREATE TABLE `app_mymodel` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `owner_id` integer
)
ALTER TABLE `app_mymodel` ADD CONSTRAINT `owner_id_refs_id_34553282` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`);

Таким образом, кажется, что сама таблица допускает значения Null, но ограничение FK на уровне БД фактически ограничивает значения фактическими ссылками,поэтому нет значений NULL ...

Это ошибка в Django?

EDIT: Оказывается, таблица, созданная с помощью предыдущей команды , будет принимает значения NULL в столбце FK и фактически имеет DEFAULT NULL в спецификации столбца, когда записывается с SHOW CREATE TABLE app_mymodel;.Странно, но я не могу сейчас повторить ошибки.

0 голосов
/ 08 сентября 2010

Я не уверен в этом, но я думаю, что вам нужно потерять «default = None» и выполнить сброс / syncdb.По умолчанию переопределяет пустую / пустую информацию.Т.е. если вы дадите пробел в админке, он будет хранить None (представление которого может варьироваться от БД к БД).Мне нужно взглянуть на код / ​​документацию, чтобы быть более уверенным.

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