Django ORM的复杂查询

时间:2013-06-12 18:49:18

标签: django django-orm

我正在尝试使用Django的ORM执行复杂的查询,我似乎找不到一个好的解决方案。也就是说,我有一个Web应用程序,用户可以根据视频回答问题。我需要显示指定用户的所有视频,这些视频至少有一个问题未答复(未响应)。我还没有能够用ORM搞清楚......我知道我可能会为此编写一个SQL查询并使用原始SQL函数执行它,但我真的更愿意留在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 个答案:

答案 0 :(得分: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,并获取属于该查询的视频。