【问题标题】:How to perform Left Outer Join in Django ORM ?如何在 Django ORM 中执行左外连接?
【发布时间】:2018-04-08 16:29:57
【问题描述】:

我有以下型号:

class CandidateDetail(models.Model):
    full_name = models.CharField(max_length=128, null=True)
    email_id = models.CharField(max_length=64, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)


class Retake(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True)
    candidate_detail = models.ForeignKey('CandidateDetail')
    is_expired = models.BooleanField(default=False)
    owner_detail = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

我要执行以下左外连接查询:

SELECT s.*, r.* FROM app_candidatedetail s LEFT OUTER JOIN app_retake r ON (s.id = r.candidate_detail_id)

数据库是 Postgresql。

我可以使用

进行查询

qset = CandidateDetail.objects.raw('SELECT s.*, r.* FROM app_candidatedetail s LEFT OUTER JOIN app_retake r ON (s.id = r.candidate_detail_id)')

CandidateDetail 表的id 字段是Django 的默认ID,它是一个IntegerField 作为主键。

但是,我想在序列化程序中使用它来将结果作为 JSON 返回,但我找不到。请帮助我解决这个问题,了解如何为此编写 ORM 查询以及如何为此查询制作序列化程序。

谢谢。

【问题讨论】:

    标签: django postgresql join


    【解决方案1】:

    由于您的要求是 JSON,

    试试这个,

    >>> emp = Resource.objects.filter(der_current_role="2D Supervisor").values()
    >>> for i in emp:
    ...  i.update(Role.objects.filter(emp_id=i['emp_id']).first().__dict__)
    ... 
    >>> emp
    

    【讨论】:

    • n+1 个查询,如果 Role.objects.filter(emp_id=i['emp_id']).first() 返回 None 会发生什么?
    猜你喜欢
    • 2020-05-18
    • 2022-01-05
    • 1970-01-01
    • 2014-11-26
    • 2018-02-10
    • 2018-10-10
    • 1970-01-01
    • 2021-07-25
    • 2021-06-23
    相关资源
    最近更新 更多