У меня есть data_template, devices_data и device. Каждое устройство имеет значение для каждой информации в data_template. Эти значения хранятся в devices_data. Я хочу перечислить data_template для одного устройства со значениями, которые имеет это устройство. Если для некоторых данных нет значения, покажите None.
Это как-то связано с left_join. Вот моя модель:
from pony.orm import *
db = Database()
class DataTemplate(db.Entity):
id = PrimaryKey(int, auto=True)
name = Required(str)
data_values = Set("DeviceData")
class Device(db.Entity):
id = PrimaryKey(int, auto=True)
name = Required(str)
device_values = Set("DeviceData")
class DeviceData(db.Entity):
id = PrimaryKey(int, auto=True)
value = Required(int)
data_name = Required(DataTemplate)
device= Required(Device)
db.bind(provider='sqlite', filename=':memory:')
db.generate_mapping(create_tables=True)
set_sql_debug(True)
with db_session:
dev1 = Device(name='Receiver')
dev2 = Device(name='TV')
dat_temp1 = DataTemplate(name="height")
dat_temp2 = DataTemplate(name="width")
dat_temp3 = DataTemplate(name="length")
dd1 = DeviceData(value=100, data_name=dat_temp1, device=dev1)
dd2 = DeviceData(value=50, data_name=dat_temp2, device=dev1)
dd3 = DeviceData(value=200, data_name=dat_temp1, device=dev2)
dd4 = DeviceData(value=40, data_name=dat_temp2, device=dev2)
dd5 = DeviceData(value=30, data_name=dat_temp3, device=dev2)
commit()
print(left_join((d, val) for d in DataTemplate for val in d.data_values if val.device == dev1)[:])
с этим left_join
Я получаю: [(DataTemplate[1], DeviceData[1]), (DataTemplate[2], DeviceData[2])]
и равен:
SELECT "d"."id", "val"."id"
FROM "DataTemplate" "d"
LEFT JOIN "DeviceData" "val"
ON "d"."id" = "val"."data_name"
WHERE "val"."device" = ?
[1]
но я хочу получить: [(DataTemplate[1], DeviceData[1]), (DataTemplate[2], DeviceData[2]), (DataTemplate[3], None)
и этот запрос должен быть:
SELECT "d"."id", "val"."id"
FROM "DataTemplate" "d"
LEFT JOIN "DeviceData" "val"
ON "d"."id" = "val"."data_name" AND "val"."device" = ?
[1]