由于django中orm不支持联合查询, 所以选择通过mysql中创建视图来实现join
mysql视图:
create definer = user@`%` view v_room_host as
select
sr.id as serverroom_ptr_id, # 必须
sr.room_name as room_name,
sr.update_time as sr_update_time,
sr.create_time as sr_create_time,
sh.id as serverhost_ptr_id, # 必须
sh.hostname as hostname,
sh.ip as ip
from server_host sh
left join server_room sr on sh.server_room_id= sr.id;
可以用多继承实现视图类:
class ViewRoomHost(mymodels.ServerRoom, mymodels.ServerHost):
def __str__(self):
return "ViewRoomHost"
class Meta:
managed = False
db_table = 'v_room_host'
这样避免在视图类中重新写一遍基类的成员变量,尤其是成员变量比较多的时候,能省不少事
注意:如果视图中没有_ptr_id那两行, 会报错Unknown column ‘xxx_ptr_id‘ in ‘field list
原因是继承时class会多出一个变量xxx_ptr_id, 需要在对应的视图类中添加xxx_ptr_id.