【问题标题】:Django LEFT JOIN - One to ManyDjango LEFT JOIN - 一对多
【发布时间】:2017-04-04 11:47:41
【问题描述】:

我有以下型号:

class Employee(models.Model):

    def getFullname(self):
        return '{}, {} {}'.format(self.empLastname,self.empFirstname, self.empMiddlename)

    empID = models.CharField(primary_key=True, max_length= 50, null=False)
    empLastname = models.CharField(max_length=50)
    empFirstname = models.CharField(max_length=50)
    empMiddlename = models.CharField(max_length=50, null=True)
    fullname = property(getFullname)

    def __str__(self):
       return self.fullname

class Picture(models.Model):
    empID = models.ForeignKey(Employee, related_name="pictures", to_field='empID', on_delete = models.CASCADE)
    picture = models.ImageField('Uploaded image')
    isDef = models.BooleanField(default=False)

我想查询图片模型中isDefault=True 的所有员工。但并非所有员工都有照片。所以基本上我想查询isDefault=True的所有员工和所有没有图片的员工。

我的查询是这样的:

SELECT manager_employee.`*`, manager_picture.*
FROM manager_employee
LEFT JOIN manager_picture ON (manager_employee.empID = manager_picture.empID_id
AND manager_picture.isDef)

serializer.py

class PictureSerializer(serializers.ModelSerializer):
      class Meta:
            model = Picture
            fields = (
                  'empID',
                  'picture',
                  'isDef'
            )

class EmployeeListSerializer(serializers.ModelSerializer):
      pictures = PictureSerializer(many = True, read_only = True)

      class Meta:
            model = Employee
            fields = (
                  'empID',
                  'empLastname',
                  'empFirstname',
                  'empMiddlename',
                  'fullname',
                  'pictures'
            )

这个查询给了我正确的结果.. 问题是如何在Django.. 中做到这一点。

假设我有 Employee 模型的记录

==================================================== ============================ 员工ID |雇员姓氏 | emp名字 | emp中间名 |全名 | ==================================================== ============================ 1 |能源部 |约翰 |史密斯 |能源部,约翰·史密斯 | -------------------------------------------------- -------------------------- 2 |波特 |哈利 |月亮 |波特,哈利..| -------------------------------------------------- -------------------------- 3 |啊啊艾伯 |加速器 | ... | -------------------------------------------------- -------------------------- 4 |咩| bbbb |密送| ... | -------------------------------------------------- --------------------------

现在在图片模型中

================================================= 员工ID |图片 |定义 | ================================================= 1 | Pic1.jpg | 0 | ------------------------------------------------ 1 | Pic2.jpg | 0 | ------------------------------------------------ 1 | Pic3.jpg | 1 | *这使它成为默认值* ------------------------------------------------ 2 | emp2Pic1.jpg | 1 | *这使它成为默认值* ------------------------------------------------ 2 | emp2Pic2.jpg | 0 | ------------------------------------------------ 4 | emp4Pic1.jpg | 0 | ------------------------------------------------ 4 | emp4Pic2.jpg | 1 | *这使它成为默认值* ------------------------------------------------

现在当我尝试这个 SQL 时:

SELECT manager_employee.`*`, manager_picture.*
    FROM manager_employee
    LEFT JOIN manager_picture ON (manager_employee.empID = manager_picture.empID_id
    AND manager_picture.isDefault)

这给我一个结果:

==================================================== ======================== 员工ID |雇员姓氏 | emp名字 |工作中 |图片 |定义 | 1 |能源部 |约翰 |史密斯 | Pic2.jpg | 1 | 2 |波特 |哈利 |月亮 | emp2Pic1.jpg | 1 | 3 |啊啊艾伯 |加速器 | (空) | (空) | 4 |咩| bbbb |密送| emp4Pic2.jpg | 1 | -------------------------------------------------- ----------------------

如何在 Django 中实现?

请有人帮助我..TIA..

【问题讨论】:

  • @PiyushS.Wanare 我检查了链接。但答案是 LEFT OUTER JOIN 而不是 LEFT JOIN。当我测试答案时,它什么也没给我..
  • Picture.objects.filter(isDefault=True,picture__isnull=True) 这是您要找的吗?这将为您提供图片模型中 isDefault = True 且没有图片的所有员工。
  • BDW 你正在处理哪个数据库?
  • 我刚刚编辑了我的邮递员,并包含了serializer.py.. 也许我遇到了serializer.py 的问题,但我只是不知道是什么.. 我已经尝试过@987654332 @ 但它给了我一个错误django.core.exceptions.FieldError: Cannot resolve keyword 'isDefault' into field. Choices are: empFirstname, empID, empLastname, empMiddlename, pictures.. 我正在使用MySQL

标签: python django django-models orm


【解决方案1】:

Django 为您提供 ORM,因此您不必编写 SQL。 检查这个:Django queryset API reference

此外,如果您想检查 Django 查询在 SQL 中的外观。你可以在 django shell 终端中这样尝试:

>>> queryset = MyModel.objects.all()
>>> print queryset.query
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"

【讨论】:

  • 感谢回复。。我没有写SQL...我只是用它来检查我的要求是否正确,这就是我发布示例查询的原因。唯一的问题是我不知道如何在 Django 中做到这一点。我知道 ModelName.Objects.all() 看起来像“SELECT * FROM ModelName”。我不知道如何在 Django 中执行 LEFT JOIN。希望你明白我的意思。我的问题是views.py 或serializers.py 是什么样的。
  • 这不是操作人员想要的
猜你喜欢
  • 2019-08-27
  • 1970-01-01
  • 2015-07-14
  • 2023-04-09
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
相关资源
最近更新 更多