【问题标题】:Deleting related objects deletes the ForeignKey object删除相关对象会删除 ForeignKey 对象
【发布时间】:2017-06-26 17:18:52
【问题描述】:

我有以下型号:

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()

我认为查询集是惰性的,所以也许我需要在删除之前对其进行评估,所以我打印了它,但这不起作用。

print questions
questions.delete()

我知道将 ForeignKey 设为 null 将为我提供 clear 和 remove 之类的方法,但我不想这样做,因为我不想要任何孤立的用户问题。

我更新了 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)

我运行了makemigrationsmigrate,但是当我运行下面的查询时,问题模型仍然被删除。

user.questions.all().delete()

【问题讨论】:

    标签: django python-2.7 django-1.7


    【解决方案1】:
    question = models.ForeignKey(Question, related_name='answers', on_delete=models.SET_NULL, null=True)
    

    未经测试,但应该可以工作。

    您的问题是与数据库相关的问题,删除外键时,数据库将尝试删除相关行。

    this great answer 上阅读有关其他选项的更多信息。

    【讨论】:

    • 我试过了,但它对我不起作用。我认为 models.SET_NULL 要求该字段可以为空,而 on_delete 似乎只指关系的一侧。因此,当我删除问题时,我可以保留答案,但我的问题是,当我删除答案时,我想保留问题。
    • 删除问题并保留答案是默认行为,我忘了该字段需要null=True,更新了答案。这是有道理的,因为在删除答案时,外键字段应该为空
    • 别忘了运行makemigrationmigrate
    • 我真的不想将该字段设置为可为空,因为我不喜欢孤立答案的想法(因为没有问题,答案毫无意义)但我设置了 null=True 和 on_delete=models。 SET_NULL。结果还是把问题删了。我确保运行 makemigrations 和 migrate
    • 您的回答对我有用。我没有使用问答模型,这些模型只是我正在研究的更复杂模型的类比。我正在查看错误的关系,这就是我的模型被删除的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多