У меня есть следующие модели:Джанго 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?
Пожалуйста, кто-нибудь помочь мне .. ТИА ..
проверить это http://stackoverflow.com/questions/21271835/left-join-django-orm –
@ PiyushS.Wanare Я проверил ссылку. но ответ - LEFT OUTER JOIN, а не LEFT JOIN. Когда я проверяю ответ, это ничего мне не дало. – N0LrAm
'Picture.objects.filter (isDefault = True, picture__isnull = True)' это вы ищите? Это даст вам весь сотрудник из моделей Picture, для которых isDefault = True и не имеет изображения. –