如何做一个Django子查询

时间:2018-01-27 03:33:47

标签: python sql django postgresql

我有两个完成同样事情的代码示例。一个是使用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),并确保只有消费者没有投票的调查被退回。

1 个答案:

答案 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 - 如果我们有一个值列表并且我们想要过滤/排除与这些值匹配的所有项目,这非常有用。

希望这有帮助!