python - 如何删除某些类型的django中的记录?
问题描述
我基本上是在构建一个问答游戏。我在数据库中存储了三种类型的记录- Question
, Answer
, Hint
.
现在我想在答案中添加一个删除功能,这样当用户删除答案时,它上面的所有内容都将被删除。
因此,用户可能会提出一个问题,得到一些提示并最终得到答案。然后用户选择删除答案,并且在最后一个问题之前的所有内容都会被删除。
我知道如何删除最后的n
记录
last_n = Message.objects.all().order_by('-id')[:10].delete()
但这意味着在最后的n
记录中,可能会提出多个问题,因此可以删除这两个问题。
我的条件需要从触发的位置一直删除到最新的类型消息Question
。
现在我只能得到特定类型的消息,而不是特定类型
Message.objects.filter(type="Question").order_by('-id')[:10]
我该如何做到这一点?
解决方案
假设答案的 id 是 99(这是触发删除事件的地方)并且问题的 id 是 80。此外,每个消息条目都需要与特定用户相关联(您的问题中没有提到,所以我我假设它是那样的)。
answer = Message.objects.get(id=99)
user = answer.user
qs = Message.objects.annotate(
last_question_id=Subquery(
Message.objects.filter(type="question", user=user).order_by("-id").values("id")[:1]
)
).filter(
user=user, id__gt=F('last_question_id'), id__lt=answer.id
).delete()
我在这里做了一些假设,如果这些假设是错误的,我的回答也将无效。
假设 1:消息模型对用户有一个 FK
假设2:用户一次只能回答一个问题。即紧接在答案之前的问题是与答案相关联的问题。
假设3:当用户得到答案后触发DELETE事件时,只会删除用户上一个问题和用户上一个答案之间的东西。
让我知道这是否是您正在寻找的答案。
推荐阅读
- adonis.js - Adonisjs 恢复令牌模型迁移
- angular - 如何配置 Angular 以呈现 HTML 注释?
- c - 在 linux 手册页中,为什么在第 2 节(系统调用)和第 3 节(libc)中都列出了一些函数
- python - 更改使用文件中的数据创建的箱线图的大小
- python - 构建正则表达式以仅提取域
- python - 当 x 和 y 是具有条件的相同变量时的 Seaborn 散点图
- php - 如何显示对特定帖子的评论
- visual-studio - 在创建具有重叠控件的对话框时使用 Visual Studio 资源编辑器的任何提示?
- r - 在 R 中对大型数据集的行进行分组
- javascript - 用 D3 更新力有向图