2017-02-08 9 views
1

У меня есть следующие модели:Удаление связанных объектов удаляет объект ForeignKey

class User(models.Model): 
     user_question = models.ForeignKey(UserQuestion) 

class Question(models.Model): 
     text = models.CharField(max_length=255) 

class UserQuestion(models.Model): 
     answer = models.CharField(max_length=255) 
     question = models.ForeignKey(Question) 
     user = models.ForeignKey(User, related_name='questions') 

При запуске запроса ниже пользовательской модели также удалены

user.questions.all().delete() 

Есть ли способ, чтобы удалить вопросы без удаления пользователя?

Я попытался итерация вопросы и что не работает

questions = user.questions.all() 
for an in questions: 
    answer.delete() 

Я думал, что QuerySet был ленивым, так, может быть, мне нужно, чтобы оценить его перед удалением, чтобы я напечатал его, и это не сработало.

print questions 
questions.delete() 

Я знаю, что делает ForeignKey Nullable бы предоставить мне методы, как ясно и удалить, но я не хочу, чтобы это сделать, потому что я не хочу никаких осиротевших вопросы пользователей.

Я обновил ForeignKey следующим

class UserQuestion(models.Model): 
    answer = models.CharField(max_length=255) 
    user = models.ForeignKey(User, related_name='questions', null=True, on_delete=models.SET_NULL) 

Я выбежала makemigrations и migrate, но когда я побежал запрос ниже на вопрос модели еще удален.

user.questions.all().delete() 

ответ

0
question = models.ForeignKey(Question, related_name='answers', on_delete=models.SET_NULL, null=True) 

проверялось, но должно работать.

Ваша проблема связана с БД, при удалении внешнего ключа БД попытается удалить связанную строку.

Подробнее о других вариантах на this great answer.

+0

Я пробовал это, и это не сработало для меня. Я думаю, что models.SET_NULL требует, чтобы поле было нулевым, а on_delete, похоже, относится только к одной стороне отношения. Поэтому, когда я удаляю вопрос, я могу сохранить ответы, но моя проблема в том, что когда я удаляю ответы, я хочу оставить вопрос. – Crystal

+0

Удаление вопроса и сохранение ответа - это поведение по умолчанию, я забыл, что для этого поля нужно «null = True», обновил ответ. Это имеет смысл, потому что при удалении ответа поле внешнего ключа должно быть пустым –

+0

Также не забудьте запустить 'makemigration' и' migrate' –