2010-08-14 34 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查詢。