我基本上是在制作问答游戏。我在数据库中存储了三种类型的记录-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]
我该如何实现?
答案 0 :(得分:0)
假定答案的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事件时,只会删除用户最后一个问题和用户最后一个答案之间的内容。
让我知道这是否是您想要的答案。