2016-11-21 44 views
1

我有以下型号:Django的LEFT JOIN - 一对多

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 ..

假设我有员工记录模型

 
============================================================================= 
empID | empLastname | empFirstname | empMiddlename | fullname  | 
============================================================================= 
    1  | Doe   | John   | Smith   | Doe, John Smith | 
----------------------------------------------------------------------------- 
    2  | Potter   | Harry   | Moon   | Potter, Harry ..| 
----------------------------------------------------------------------------- 
    3  | Aaaa   | Abbb   | Accc   | ...    | 
----------------------------------------------------------------------------- 
    4  | Baaaa   | Bbbb   | Bccc   | ...    | 
----------------------------------------------------------------------------- 

现在在图片模式

 
================================================ 
empID  | Picture     | isDef | 
================================================ 
    1  | Pic1.jpg     | 0  | 
------------------------------------------------ 
    1  | Pic2.jpg     | 0  | 
------------------------------------------------ 
    1  | Pic3.jpg     | 1  | *which makes this as default* 
------------------------------------------------ 
    2  | emp2Pic1.jpg    | 1  | *which makes this as default* 
------------------------------------------------ 
    2  | emp2Pic2.jpg    | 0  | 
------------------------------------------------ 
    4  | emp4Pic1.jpg    | 0  | 
------------------------------------------------ 
    4  | emp4Pic2.jpg    | 1  | *which makes this as default* 
------------------------------------------------ 

现在,当我尝试这个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) 

这给我一个结果:

 
========================================================================= 
empID | empLastname | empFirstname | empMiddle | Picture  | isDef | 
1 | Doe   | John   | Smith  | Pic2.jpg  | 1  | 
2 | Potter  | Harry  | Moon  | emp2Pic1.jpg | 1  | 
3 | Aaaa  | Abbb   | Accc  | (null)  | (null) | 
4 | Baaaa  | Bbbb   | Bccc  | emp4Pic2.jpg | 1  | 
------------------------------------------------------------------------- 

如何我在Django实现这一点?

请别人帮我.. TIA ..

+0

检查这个http://stackoverflow.com/questions/21271835/left-join-django-orm –

+0

@ PiyushS.Wanare我检查的链接。但答案是LEFT OUTER JOIN而不是LEFT JOIN。当我测试答案,它没有给我什么.. – N0LrAm

+1

'Picture.objects.filter(isDefault = True,picture__isnull = True)'这是你要找的吗?这将为您提供来自Picture模型的所有员工,其中isDefault = True且没有图片。 –

回答

-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" 
+0

感谢您的答复人..我没有写SQL ...我只是用它来检查我的要求是否正确,这就是为什么我张贴示例查询。唯一的问题是我不知道如何在Django中做到这一点。我知道ModelName.Objects.all()看起来像“SELECT * FROM ModelName”..我不知道如何在Django中执行LEFT JOIN。希望你明白我的观点..我的问题是views.py或serializers.py的样子。 – N0LrAm

+0

这不完全是你想要的 –