Как выбрать данные из двух не связанных таблиц? 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 шт):
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-ой модели
Ну и записывать их в массив или куда надо
В формате 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