添加AND子句的Django LEFT JOIN查询:可能吗?

Joh*_*ohn 5 mysql django

我正在尝试做一个包含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;
Run Code Online (Sandbox Code Playgroud)

这是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'))
Run Code Online (Sandbox Code Playgroud)

但是最后一个过滤器没有插入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)
  ...
Run Code Online (Sandbox Code Playgroud)

cez*_*zar 1

但最后一个过滤器并没有像我希望的那样插入到 LEFT JOIN 中。

不,姜戈不是魔术师:)

select_related()如果您在左侧有允许的外键NULL(可以为空)的情况下使用,Django ORM 将进行 LEFT JOIN 。

它可能是这样的:

Edition.objects.select_related('questionnaires').filter("//your searching criteria")
Run Code Online (Sandbox Code Playgroud)

“AND 条件”仍然存在问题,但我希望我的回答能给您一些如何进一步进行的线索。

这个问题真的很有趣,今晚我会尝试修改一下。

编辑:

以下是 Django 文档的相应链接: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.select_lated

这是我在 Google 网上论坛上找到的内容: https://groups.google.com/forum/#! topic/django-users/CjHVVmu-00c