【问题标题】:How to join like sql in django models如何在 django 模型中像 sql 一样加入
【发布时间】:2022-01-21 06:26:49
【问题描述】:

我有这三个没有外键的模型

class SchoolReg(models.Model):
    # TODO: Define fields here
    user = models.ForeignKey('front.User', on_delete= models.CASCADE)
    fullname = models.CharField(max_length= 100)
    dob = models.CharField(max_length= 50)

class CandidateCode(models.Model):
    candidateCode = models.IntegerField()
    regId = models.IntegerField()
    regCategory = models.CharField(max_length=20)

class Sec1(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE, blank= True, null = True)
    centreName = models.CharField(max_length= 50, blank= True, null = True)
    compRegNo = models.CharField(max_length= 50, blank= True, null = Tru

现在我想加入这些模型并制作一个这样的学生查询集

SELECT * from school_reg s
LEFT JOIN sec1 c on s.user_id = c.user_id
LEFT JOIN candidate_code cc on cc.reg_id = s.school_id
WHERE c.center_name = "centreName"

【问题讨论】:

  • 欢迎来到 Stack Overflow!你试过什么?什么不工作?
  • 我现在做了 sql 查询我想在 Django ORM 模型中做同样的查询
  • 想加入这三个模型 SchoolReg.user == Sec1.user 然后 SchoolReg.id == CandidateCode.regId

标签: django


【解决方案1】:

您需要在过滤语句according to the documentation.上指定关系

This stack overflow answer 甚至有一个很好的建议,即使用.query() 方法来反转您需要的特定查找。

【讨论】:

  • 我可以加入两个模型,但如何加入第三个模型
  • @HabibUrRehman 显示您尝试加入 2 个模型的代码
  • @viam0Zah sec1 = Sec1.objects.get(centreName = "centreName") students = SchoolReg.objects.filter(user = sec1.user).all()
  • 问题是现在我在学生中有多个对象,我想加入第三个模型 CandidateCode
  • 我想要这样的东西得到这些模型的两个值 ca = CandidateCode.objects.filter(regId = students.id).all()
【解决方案2】:

我们不能使用select_related(),因为我们这里没有外键所以我们使用原始sql performing raw queries

我用这个来解决问题

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("""SELECT s.id, s.dob, cc.candidateCode, s.fullname,  
    q.title, e.examDate, c.centreName from lrnadmin_schoolreg s
    LEFT JOIN lrnadmin_bookingexam e on s.exam_id = e.id
    LEFT JOIN front_sec1 c ON s.user_id = c.user_id
    LEFT JOIN lrnadmin_qualification q ON q.id = s.qualification_id
    LEFT JOIN lrnadmin_candidatecode cc ON cc.regId = s.id
    WHERE c.id = %s""", [request.POST['centre']])
row = cursor.fetchall()

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多