Как выбрать данные из двух не связанных таблиц? Django ORM + MySQL

Подключаюсь с помощью Django ORM к удаленной базе данных MySQL. После выполнения команды

python manage.py inspectdb

добавил в models.py такие классы:

class CustomerEquipment(models.Model):
    serial_number = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    dateofсheck = models.DateField()
    address = models.CharField(max_length=255)
    state = models.IntegerField()
    state_timestamp = models.DateTimeField()
    department_equipment = models.IntegerField()
    state_type = models.IntegerField()
    manufacture = models.CharField(max_length=45)

    class Meta:
        managed = False
        db_table = 'customer_equipment'


class LogCustomerEquipment(models.Model):
    serial_number = models.CharField(max_length=255)
    state = models.IntegerField()
    state_timestamp = models.DateTimeField()
    department = models.IntegerField()
    state_type = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'log_customer_equipment'

Нужно сделать выборку всех уникальных serial_number из таблицы LogCustomerEquipment за определенный период и др. указанными фильтрами:

list_equipments = LogCustomerEquipment.objects.using('portal').filter(Q(state_type=10) & Q(state_timestamp__gte='2019-12-01 00:00:00') & Q(state_timestamp__lte='2019-12-01 23:59:59') & Q(department=19))

После этого, требуется выбрать из таблицы CustomerEquipment по каждому найденному serial_number - расширенные данные (name, address, manufacture и пр.).

Как это сделать? Как объединить запросы? Как их оптимизировать?

serial_number в обоих таблицах - одинаковые. Стоит также учитывать, что указанная удаленная база данных используется в других приложениях. Не только мной. Не хочется менять структуру базы данных, поскольку можно что-то сломать у других программ/пользователей.


Ответы (2 шт):

Автор решения: Vadim.Sharoikin
list_equipments = LogCustomerEquipment.objects.using('portal').filter(Q(state_type=10) & Q(state_timestamp__gte='2019-12-01 00:00:00') & Q(state_timestamp__lte='2019-12-01 23:59:59') & Q(department=19))
for a in list_equipment:
    id = a.list_equipments.serial_number ////получаем serial_number из 2-ой модели
    additional_data = CustomerEquipment.objects.filter(serial_number=id) ////#получаем объект из 1-ой модели 

Ну и записывать их в массив или куда надо

→ Ссылка
Автор решения: Akina

В формате SQL это будет что-то вроде

SELECT lce.*, ce.*  /* заменить на список нужных полей */
FROM LogCustomerEquipment lce
JOIN CustomerEquipment ce ON lce.equipment_id = ce.id
WHERE /* все условия отбора */
      lce.state_type=10
  AND lce.state_timestamp__gte='2019-12-01 00:00:00'
  AND lce.state_timestamp__lte='2019-12-01 23:59:59'
  AND lce.department=19

или, если такое проще преобразовывать для фреймворка

SELECT lce.*, ce.*  /* заменить на список нужных полей */
FROM LogCustomerEquipment lce, CustomerEquipment ce 
WHERE lce.equipment_id = ce.id
      /* и теперь все условия отбора */
  AND lce.state_type=10
  AND lce.state_timestamp__gte='2019-12-01 00:00:00'
  AND lce.state_timestamp__lte='2019-12-01 23:59:59'
  AND lce.department=19
→ Ссылка