2013-06-12 132 views
0

我試圖用Django的ORM執行一個複雜的查詢,我似乎無法找到一個很好的解決方案。也就是說,我有一個Web應用程序,用戶可以根據視頻回答問題。我需要爲指定用戶顯示至少有一個未回答(未回覆)問題的所有視頻。我還沒能用ORM弄清楚它......我知道我可能會爲此編寫一個SQL查詢並且只用原始SQL函數執行它,但我真的更願意留在ORM中。Django ORM的複雜查詢

型號:視頻,問題,響應和默認用戶。

關係:

  • 問題有很多人對視頻許多關係
  • 響應具有外鍵每到一個問題,視頻和用戶

什麼查詢需要做的:

  • 顯示指定用戶的所有視頻,其中至少有一個視頻問題未答覆(沒有迴應)。

任何幫助都會很棒!我一直在努力,這太久了。

編輯:我是(簡化)的模型:

class Video(TimeStampedModel): 

    title = models.CharField(max_length=200) 
    source_id = models.CharField(max_length=20) 


class Question(TimeStampedModel): 

    DEMOGRAPHIC_QUESTION = 'd' 
    QUESTION_TYPES = (
     (VIDEO_QUESTION, 'Video related question'), 
     (DEMOGRAPHIC_QUESTION, 'Demographic question'), 
    ) 

    MULTIPLE_CHOICE = 0 
    PLAIN_TEXT = 1 
    RESPONSE_TYPE = (
     (MULTIPLE_CHOICE, 'Multiple Choice'), 
     (PLAIN_TEXT, 'Plain Text') 
    ) 

    type = models.CharField(max_length=1, choices=QUESTION_TYPES) 
    videos = models.ManyToManyField(Video, null=True, blank=True) 
    title = models.CharField(max_length=500) 
    priority = models.IntegerField() 

class Response(TimeStampedModel): 
    user = models.ForeignKey(User) 
    question = models.ForeignKey(Question) 
    video = models.ForeignKey(Video, blank=True, null=True) 
    choice = models.ForeignKey(Choice, null=True, blank=True,related_name='selected_choice') 
    text = models.CharField(max_length=500, blank=True) 

// Not relevant but included for clarity 
class Choice(TimeStampedModel): 
    question = models.ForeignKey(Question) 
    text_response = models.CharField(max_length=500) 
    image = models.FileField(upload_to=_get_choice_img_path, blank=True) 
    value = models.IntegerField(default=0) 
    external_id = models.IntegerField(default=0) 
+1

分享你擁有的模特。這會更容易幫助 – karthikr

+0

問題 - 視頻是多對多的?爲什麼?似乎每個問題都只有一個視頻,即使每個視頻都有很多問題。 – mklauber

+0

是的問題 - 視頻是多對多的,因爲我們希望能夠將相同的問題應用於多個視頻。例如 - 這部影片最受歡迎的部分是什麼?這個問題適用於許多視頻。 – user2479537

回答

0

你的模型看起來喜歡的方式在邏輯上來看,我認爲有些事情接近以下應該罰款。

q = Response.objects.select_related().filter(user__name=user).filter(response__choice=None) 

videos = Video.objects.filter(id__in=q.extra(where=["{}>=1".format(q.count())]).values('video_id')) 

希望你明白我在那裏做了什麼。第一行基本上試圖對模型對象進行自然連接。第二行是使用第一行生成的查詢來獲取計數並檢查它是否至少爲1,並獲取屬於該查詢的視頻。