我有“提交”字段,其中包含用户和问题。如何获得SQL搜索结果,该结果将为每个用户问题对提供仅一个结果的列表?
模型是这样的:
class Problem(models.Model):
title = models.CharField('Title', max_length = 100)
question = models.TextField('Question')
class Submission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
solution = models.CharKey()
time = models.DateTimeField('Time', auto_now_add=True)
答案 0 :(得分:13)
试试这个:
distinct_users_problems = Submission.objects.all().values("user", "problem").distinct()
它会给你一个像这样的词典列表:
[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}]
包含所有不同的对。
它实际上会产生您通常的SELECT DISTINCT SQL查询。
答案 1 :(得分:3)
更新2 :
(阅读OP的评论后)我建议添加一个新模型来跟踪最新的提交。称之为LatestSubmission
。
class LatestSubmission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
submission = models.ForeignKey(Submission)
然后你可以
Submission.save()
以创建/更新LatestSubmission
中的条目这样LatestSubmission
每个问题用户提交组合将包含一行,指向每个用户对问题的最新提交。完成此操作后,您可以触发一个查询:
LatestSubmission.objects.all().order_by('problem')
更新:
由于OP已发布示例代码,现在可以按如下方式更改解决方案:
for user in User.objects.all(): # Get all users
user.submission_set.latest('time') # Pick the latest submission based on time.
原始答案
如果没有基于日期/时间的标准来决定哪个是“较旧”或“较新”,您可以使用id
的主键(Submission
)来“忽略旧的” ”。
for user in User.objects.all(): # Get all users
user.submission_set.latest('id') # Pick the latest submission by each user.