当前位置: 首页 > 知识库问答 >
问题:

删除相关对象将删除ForeignKey对象

詹甫
2023-03-14

我有以下型号:

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)

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

user.questions.all().delete()

共有1个答案

裴华荣
2023-03-14
question = models.ForeignKey(Question, related_name='answers', on_delete=models.SET_NULL, null=True)

未经测试,但应该工作。

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

阅读更多关于这个伟大答案的其他选项。

 类似资料:
  • 问题内容: 我有以下两个实体: 1-播放列表: *保存或更新播放列表实体时,需要使用 *CascadeType.ALL 来保存和更新PlaylistadMap集合。 orphanRemoval = true :在删除播放列表实体时需要,PlaylistadMap引用也应删除。 2- PlaylistadMap: 使用我删除播放列表时,出现以下异常: 请告知如何解决此异常。 问题答案: 将 Fetc

  • 问题内容: 我收到上述错误“ org.hibernate.ObjectDeletedException:被删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人可以帮我这个问题是什么,应该怎么解决? 谢谢。 问题答案: 没有映射结束代码会有点困难…这通常是由于要删除与集合关联的对象引起的。 您必须从拥有的收藏夹中删除对象,然后再删除对象 但是您可以通过这种方式使用deleteOrpha

  • 问题内容: 这是使用for每个循环从Java中的LinkedList中查找和删除项目的有效方法,是否可能会导致不一致: 问题答案: 其他人提到有效点,通常这不是您如何从集合中获取对象。但是,在这种情况下,因为您一旦退出循环就可以了。 但是,如果要在之后继续迭代,则需要使用迭代器。否则,您将获得,或更普遍的情况是未定义的行为。 所以,是的, 如果您不在别人之后,您会没事的。 对于那些说这将失败的人来

  • 问题内容: 我知道这是一个杂乱的实现,但是我基本上有这段代码(我全部写了),使用适当的菜单选项时,我需要能够从列表中删除一名学生或教师。代码中的所有其他内容都起作用,但菜单选项3和4无效。我尝试删除该对象时输入的是完全相同的信息。这是代码。这三个类别都在下面。 驱动类别: 学生班: 讲师课程: 问题答案: 您必须正确覆盖和类的方法。 覆盖等于时,也应覆盖。新学生(姓名,ID,GPA); 例如,如下

  • type String - password。 origin String(可选) - 当提供时,与原始相关的认证信息将被删除,否则整个缓存会被清除。 scheme String(可选) - 认证方案。可选 basic, digest, ntlm, negotiate。如果通过 origin删除,必须提供。 realm String(可选) - 认证的领域。如果通过 origin删除,必须提供。

  • 问题内容: 我对JavaScript的运算符有些困惑。采取以下代码: 执行完这段代码后,is ,但仍指与完全相同的对象。我猜这个对象是指向相同的对象。 这使我感到困惑,因为我希望写操作可以删除指向内存中的对象,而不仅仅是变量。 这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它 会 从内存中清除? (顺便说一下,我的测试是在Safari 4中完