2016-11-21 2 views
1

У меня есть следующие модели:Джанго 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 ..

Предположите, у меня есть запись о Employee model

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

сейчас в модели Picture

 
================================================ 
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?

Пожалуйста, кто-нибудь помочь мне .. ТИА ..

+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 предоставляет Вам ОРМ, так что вы не должны написать SQL. Проверьте это: Django queryset API reference.

Также, если вы хотите проверить, как выглядит ваш запрос Django в SQL. вы можете попробовать, как это в терминале оболочки Джанго:

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

Спасибо за ответ man .. Я не писал SQL ... Я просто использовал его, чтобы проверить правильность моих требований, поэтому я отправляю образец запроса. Единственная проблема заключается в том, что я не знаю, как это сделать в Django. Я знаю, что ModelName.Objects.all() выглядит как «SELECT * FROM ModelName» .. Я не знаю, как выполнить LEFT JOIN в Django. Надеюсь, ты получишь мою мысль. Моя проблема в том, что будет выглядеть views.py или serializers.py. – N0LrAm

+0

Это не совсем то, что нужно оператору –