Django on_delete = CASCADE не работает, не удается удалить родительскую строку с использованием raw SQL [duplicate]

char *recvmsg(){
    char *buffer = new char;
    cout<<"\nENTER NAME : ";
    cin>> buffer;
    return buffer;
}

int main(){
    char *reply = recvmsg();
    cout<<reply;
}
3
задан Imran Azad 29 December 2011 в 22:47
поделиться

3 ответа

Похоже, что Django 1.3.1 по какой-то причине не применяет свойство ON DELETE CASCADE к таблице. Возможно, это может быть связано с интерфейсом MySQL-python 1.2.3, работающим в Windows. Единственный способ решить эту проблему - через пользовательский SQL .

2
ответ дан Imran Azad 18 August 2018 в 13:05
поделиться

По умолчанию Django делает каскад. Я не совсем уверен, почему вы получаете ON DELETE RESTRICT. Django 1.3 позволяет вам выбирать альтернативные процедуры ON DELETE (используя on_delete kwarg при определении поля), и вполне возможно, что если вы унаследовали кодовую базу, кто-то, возможно, сделал это ранее, а затем удалил из кода, но пренебрег ею обновить базу данных.

Я бы предложил изменить столбец вручную, чтобы вернуть его в положение DEL DELETE CASCADE. И просто переходите оттуда. Как я уже сказал, это то, что разработчик должен сказать Django не делать; он каскадом по умолчанию.

1
ответ дан Chris Pratt 18 August 2018 в 13:05
поделиться
  • 1
    это моя собственная база кода. Я никогда не устанавливал параметр on_delete ничем иным, как CASCADE. Я запустил команду python manage.py sql app_name и заметил, что нет ссылки на ON DELETE CASCADE. Что-то странное происходит, я просто не могу понять, что это такое. – Imran Azad 29 December 2011 в 22:47

Django эмулирует ON DELETE CASCADE в Python - поэтому в таблицах базы данных он не нужен. Фактически, установка RESTRICT может даже иметь смысл, поскольку это означает, что вы не можете случайно удалить любые связанные объекты, не будучи предупрежденными об этом в admin.

В вашем случае кажется, что у вас могут быть иностранные ключевые ограничения, которые Django не знает - или, возможно, вы пытаетесь удалить с помощью raw SQL; Я не могу сказать по вашему вопросу.

Если проблема в том, что вы не можете удалить из администратора или из ORM, вам необходимо убедиться, что ваши модели определены правильно. django позаботится о сборе связанных объектов и выполнении самого каскада.

Если проблема заключается в том, что удаление не работает из необработанного SQL, вам придется либо вручную удалить связанные объекты сначала, либо ослабьте SQL-ограничение - в этом случае изменение его в каскаде может быть правильным решением.

5
ответ дан Ian Clelland 18 August 2018 в 13:05
поделиться
  • 1
    Возможно, с момента этого комментария все изменилось, но используя Django 1.9, ограничения, безусловно, создаются не эмулируемыми и создаются без применения каскада. – AaronM 14 July 2016 в 21:46
Другие вопросы по тегам:

Похожие вопросы: