2010-08-14 36 views
8

我有'提交'字段有一个用户和一个问题。我怎样才能得到一个SQL搜索结果,它将给出每个用户 - 问题对只有一个结果的列表?Django查询选择不同的字段对

模型是这样的:

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

你是什么意思“有用户和问题的领域”?你在谈论Django模型吗?发布相关代码。 – 2010-08-14 13:11:43

+0

模型是这样的: 问题:标题,问题 提交:问题(外键),用户(外键),内容 用户:auth用户 让我们假设P1,P2两个问题和U1,U2两个用户U1具有两个提交s1,s2为p1和一个(s3)为p2和u2有一个用于p1(s4),两个用于p2(s5,s6) 所以我想要一个像这样的查询集结果:s2,s3,s4,s6 即忽略旧的用户相同的问题 s2,s3, – crodjer 2010-08-14 13:17:52

回答

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

这样LatestSubmission将包含指向每个用户对该问题的最新提交的每个问题 - 用户提交组合的一行。如下

由于OP已经发布的示例代码,该解决方案现在可以改变:一旦你有了这个在地方,你可以触发一个单一查询:

LatestSubmission.objects.all().order_by('problem') 

更新

for user in User.objects.all(): # Get all users 
    user.submission_set.latest('time') # Pick the latest submission based on time. 

原答复

在没有任何日期/时间的基础上要确定哪个是“较旧”或“较新”的标准,可以使用Submission的主键(id)“忽略旧的”。

for user in User.objects.all(): # Get all users 
    user.submission_set.latest('id') # Pick the latest submission by each user. 
+0

我添加了模型细节到我的问题。 这将只给我一个用户最后提交的查询集,我想要的是所有问题的最新结果。我希望在提交字段上运行sql命令,并获取按提交时间排序的提交列表,并且如果同一用户在一个问题中提交了多个提交内容,则只会包含一个结果。 – crodjer 2010-08-14 13:58:03

+0

@Rohan Jain:我不确定您是否可以通过__ SQL查询来实现_current_模型结构。我想知道这里的其他人是否能拿出一个合适的答案。 – 2010-08-14 18:00:56

+0

我现在正在通过为提交添加一个is_latest布尔字段..... thanx fr ur help :) – crodjer 2010-08-15 05:53:55

12

试试这个:

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查询。