我正在尝试使用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)
答案 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,并获取属于该查询的视频。