Django查询按字段对选择不同

时间:2010-08-14 12:38:43

标签: python django django-queryset

我有“提交”字段,其中包含用户和问题。如何获得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)

2 个答案:

答案 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)

然后你可以

    每次用户发布问题的新解决方案时,
  1. 覆盖Submission.save()以创建/更新LatestSubmission中的条目
  2. 将一个功能添加到合适的signal
  3. 这样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.