我有两个完成同样事情的代码示例。一个是使用python,另一个是SQL。
图表A(Python):
surveys = Survey.objects.all()
consumer = Consumer.objects.get(pk=24)
for ballot in consumer.ballot_set.all()
consumer_ballot_list.append(ballot.question_id)
for survey in surveys:
if survey.id not in consumer_ballot_list:
consumer_survey_list.append(survey.id)
图表B(SQL):
SELECT * FROM clients_survey WHERE id NOT IN (SELECT question_id FROM consumers_ballot WHERE consumer_id=24) ORDER BY id;
我想知道如何使用Django的ORM和子查询使展览更清洁,更高效。
在这个例子中: 我的选票中包含一个question_id,指的是消费者已经回答的调查。
我想找到消费者尚未回答的所有调查。因此,我需要根据调查模型的ID来检查消费者选票中的每个question_id(survey.id),并确保只有消费者没有投票的调查被退回。
答案 0 :(得分:-1)
你或多或少有正确的想法。要使用Django的ORM复制SQL代码,您只需将SQL分解为每个独立的部分:
1.创建消费者24已回答的question_ids表
2.对所有不在上述表格中的ID进行调查
consumer = Consumer.objects.get(pk=24)
# step 1
answered_survey_ids = consumer.ballot_set.values_list('question_id', flat=True)
# step 2
unanswered_surveys_ids = Survey.objects.exclude(id__in=answered_survey_ids).values_list('id', flat=True)
这基本上是你在当前基于python的方法中所做的,除了我刚刚利用了Django的一些优秀的ORM功能。
.values_list()
- 这允许您从给定查询集中的所有对象中提取特定字段。.exclude()
- 这与.filter()
相反,并返回查询集中与条件不匹配的所有项。 __in
- 如果我们有一个值列表并且我们想要过滤/排除与这些值匹配的所有项目,这非常有用。 希望这有帮助!