我正在尝试执行其中包含LEFT JOIN ON (condition) AND (condition)
的Django ORM查询。但是我不知道如何做额外的AND condition
,并且很长时间地抛弃了JOIN。
添加具有第二个条件的Django过滤器并不会有帮助 - 它最终会作为WHERE子句而不是JOIN中的AND子句。
是否可以在ORM中加入ON条件和条件,或者我应该只使用SQL语句?如果有可能,你怎么做?
对于它的价值,这是我试图转换为Django的SQL查询:
SELECT
`editions_edition`.`name` AS edition,
etc
FROM
`editions_edition`
INNER JOIN `surveys_survey`
ON (`editions_edition`.`survey_id` = `surveys_survey`.`id`)
INNER JOIN `questions_question`
ON (`surveys_survey`.`id` = `questions_question`.`survey_id`)
INNER JOIN `questionnaires_questionnaire`
ON(`editions_edition`.`id`=`questionnaires_questionnaire`.`edition_id`)
INNER JOIN `entities_entity`
ON (`entities_entity`.`id` = `questionnaires_questionnaire`.`entity_id`)
LEFT JOIN `answers_answer`
ON (`answers_answer`.`question_id` = `questions_question`.`id`)
AND (`answers_answer`.`questionnaire_id` =`questionnaires_questionnaire`.`id`)
WHERE `editions_edition`.`id` = *VARIABLE HERE*
AND `questions_question`.`type` > 99
ORDER BY `entities_entity`.`name` ASC,`questions_question`.`sort_order` ASC;
LEFT JOIN正在困扰我。
我的Django查询是这样的:
query = Edition.objects
.filter(questionnaires__edition__survey__questions__type__gte=100)
.values(
'name'
,'questionnaires'
,'questionnaires__entity__name'
,'questionnaires__edition__survey__questions'
,'questionnaires__edition__survey__questions__name'
,'questionnaires__answers__answer')
.filter(questionnaires__answers__question=F('questionnaires__edition__survey__questions'))
但是最后一个过滤器并没有插入LEFT JOIN,正如我所希望的那样神奇地做到了。
有什么想法吗?
感谢
约翰
PS模型使用多个related_names进行反向查找。这些是您在上面的查询集中看到的复数。例如:
class Questionnaire(models.Model):
edition = models.ForeignKey(Edition,related_name='questionnaires')
entity = models.ForeignKey(Entity)
last_edited = models.DateTimeField(auto_now_add=False, auto_now=True)
class Question(models.Model):
name = models.CharField('Item', max_length=255, unique=False, blank=True)
survey = models.ForeignKey(Survey, related_name='questions')
type = models.IntegerField(default=100,choices=QUESTION_TYPES)
...
class Answer(models.Model):
question = models.ForeignKey(Question, related_name='answer')
questionnaire = models.ForeignKey(Questionnaire, related_name='answers')
answer = models.CharField(max_length=1024,blank=True)
class Edition(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField()
survey = models.ForeignKey(Survey)
...
答案 0 :(得分:1)
但是最后一个过滤器并没有像我希望的那样插入LEFT JOIN 它会神奇地做。
不,Django不是魔术师:)
如果在左侧有一个允许select_related()
(可以为空)的外键的条件下使用NULL
,Django ORM将进行LEFT JOIN。
可能是这样的:
Edition.objects.select_related('questionnaires').filter("//your searching criteria")
" AND条件"仍然存在问题,但我希望我的回答可以为您提供一些如何进一步处理的线索。
问题非常有趣,我今晚会尝试修补一下。
编辑:
以下是Django文档的相应链接: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.select_related
以下是我在Google网上论坛上发现的内容: https://groups.google.com/forum/#!topic/django-users/CjHVVmu-00c