当前位置: 首页 > 面试题库 >

左加入Django ORM

窦英武
2023-03-14
问题内容

我有以下型号:

class Volunteer(models.Model):
    first_name = models.CharField(max_length=50L)
    last_name = models.CharField(max_length=50L)    
    email = models.CharField(max_length=50L)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)


class Department(models.Model):
    name = models.CharField(max_length=50L, unique=True)
    overseer = models.ForeignKey(Volunteer, blank=True, null=True)
    location = models.CharField(max_length=100L, null=True)


class DepartmentVolunteer(models.Model):
    volunteer = models.ForeignKey(Volunteer)
    department = models.ForeignKey(Department)
    assistant = models.BooleanField(default=False)
    keyman = models.BooleanField(default=False)
    captain = models.BooleanField(default=False)
    location = models.CharField(max_length=100L, blank=True, null=True)

我想查询所有未分配志愿者的部门。我可以使用以下查询进行操作:

SELECT 
    vsp_department.name 
FROM   
    vsp_department 
LEFT JOIN vsp_departmentvolunteer ON vsp_department.id = vsp_departmentvolunteer.department_id  
WHERE
    vsp_departmentvolunteer.department_id IS NULL;

有没有一种更像django的方式做到这一点,还是我应该只使用原始sql?


问题答案:

您可以通过遵循查找中的向后关系来执行此操作。

>>> qs = Department.objects.filter(departmentvolunteer__isnull=True).values_list('name', flat=True)
>>> print(qs.query)
SELECT "app_department"."name" FROM "app_department" LEFT OUTER JOIN
"app_departmentvolunteer" ON ( "app_department"."id" = "app_departmentvolunteer"."department_id" )
WHERE "app_epartmentvolunteer"."id" IS NULL

以下是有关“跨多值关系”查询的文档:https :
//docs.djangoproject.com/en/stable/topics/db/queries/#spanning-multi-valued-
relationships



 类似资料:
  • 问题内容: 怪异的 (可能一点也不奇怪) 我有3个对象,即Employee,Rota和Department。 并不复杂,真的。Rota可以分配一个员工和/或部门,所有这些都使用Fluent进行配置。我所有的关联都是正确的(架构是完美的),但是我有一个奇怪的怪异之处。 当我执行并查看生成的SQL时,在Employee&Rota上有一个 LEFT OUTER JOIN 。为什么在那儿? 我不希望它这样

  • 目前我有以下查询: 产出: 它可以工作,但在加入前限制注释表。结果是,它选择前5个注释并映射它。id为5的所有评论将被忽略。 谢谢

  • 问题内容: 我有2个实体,和。它们是相关的,但是我不想将关系映射添加到bean。 我们如何 在 HQL或条件之间使用 左外部 联接 并 使用它们 ? 有一些解决方法, 按照此处所述使用本机SQL 。 添加关系并使用 从A选择a a左连接ab 。 我们可以在HQL中进行 内部 联接,例如从A a,B b中选择*,其中a.some = b.some 我一直回头看这两个选项,这还有其他选择吗?还是这不可

  • 我有一个查询和一张表。查询“EmployeeTraining”包括员工姓名、参加的培训课程、参加的日期和有效期。我希望LeftJoin返回的是所有可用的培训课程,以及每个员工缺少的课程,因此在essense中,任何空值都是空的。 “应用培训”共有5项记录。一些员工只参加了4/5的课程,在“员工培训”记录中只有4项记录。left join不应该在“DateTake”和“Expiration”中使用空

  • 问题内容: 这是我要显示用户历史记录的功能。为此,我需要显示用户的当前信用及其信用记录。 这就是我想要做的: 但是,我得到这个错误: [语法错误]第0行,列98:错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_WITH,设置为“ ON” 编辑 :我在join子句中用“ WITH”替换了“ ON”,现在我看到的只是joined列中的1个值。 问题答案: 如果您在指

  • 我使用的是LEFTJOIN,在某些情况下,没有正确的表匹配,因此用空(null)值替换正确的表列。因此,我得到了作为JSON聚合之一。 例如,Postgres 9.3创建输出 如何忽略/删除,以便在右表列为空时我有一个空的 JSON 数组 ?