Django 版本: 1.8.0
一、查询表中指定字段
使用格式 QuerySet对象.values("字段1","字段2")
实现SQL中查询指定字段的功能:
mysql> DESC auth_permission; +-----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | content_type_id | int(11) | NO | MUL | NULL | | | codename | varchar(100) | NO | | NULL | | +-----------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec) mysql> SELECT name -> FROM auth_permission; +---------------------------+ | name | +---------------------------+ | Can add log entry | | Can change log entry | | Can delete log entry | | Can add permission | | Can change permission | | Can add device | | Can change device | | Can delete device | | Can add purchase | | Can change purchase | +---------------------------+ 10 rows in set (0.00 sec)
使用Django实现
auth_permission.objects.all().values("name")
二、关联查询
使用格式 QuerySet对象.values("字段1__外键表中任意字段","字段2__外键表中任意字段")
实现SQL中多表关联查询的功能:
表area为机房表,device_type设备类型表.mysql> SELECT * -> FROM area_type; +----+---------+----------------+ | id | area_id | device_type_id | +----+---------+----------------+ | 1 | 10 | 101 | | 2 | 10 | 102 | | 3 | 10 | 103 | | 4 | 10 | 104 | | 5 | 10 | 105 | | 6 | 20 | 101 | | 7 | 20 | 102 | | 8 | 20 | 104 | | 9 | 20 | 105 | | 10 | 30 | 100 | | 11 | 30 | 101 | | 12 | 30 | 102 | | 13 | 30 | 103 | | 14 | 30 | 105 | +----+---------+----------------+ 14 rows in set (0.00 sec) mysql> SELECT * -> FROM area; +---------+-----------------+ | area_id | area_name | +---------+-----------------+ | 10 | 大河机房 | | 20 | 大江机房 | | 30 | 内网机房 | +---------+-----------------+ 3 rows in set (0.00 sec) mysql> SELECT * -> FROM device_type; +----------------+------------------+ | device_type_id | device_type_name | +----------------+------------------+ | 100 | 台式机 | | 101 | 显示器 | | 102 | 笔记本 | | 103 | 交换机 | | 104 | 路由器 | | 105 | 服务器 | +----------------+------------------+ 6 rows in set (0.00 sec)
一个机房可以有多种设备类型,一种设备类型也可以存在于多个机房中,所以两者为多对多关系.表area_type为两者的关系表.
(1) 查询每个机房对应的设备id
使用Django实现mysql> SELECT area.area_name, area_type.device_type_id -> FROM area, area_type -> WHERE area.area_id = area_type.area_id; +-----------------+----------------+ | area_name | device_type_id | +-----------------+----------------+ | 大河机房 | 101 | | 大河机房 | 102 | | 大河机房 | 103 | | 大河机房 | 104 | | 大河机房 | 105 | | 大江机房 | 101 | | 大江机房 | 102 | | 大江机房 | 104 | | 大江机房 | 105 | | 内网机房 | 100 | | 内网机房 | 101 | | 内网机房 | 102 | | 内网机房 | 103 | | 内网机房 | 105 | +-----------------+----------------+ 14 rows in set (0.01 sec)
(2) 查询每个机房对应的设备名称area_type.objects.all().values("area_id__area_name","device_type_id")
mysql> SELECT area.area_name, device_type.device_type_name -> FROM area, area_type, device_type -> WHERE area.area_id =area_type.area_id -> AND area_type.device_type_id = device_type.device_type_id; +-----------------+------------------+ | area_name | device_type_name | +-----------------+------------------+ | 大河机房 | 显示器 | | 大河机房 | 笔记本 | | 大河机房 | 交换机 | | 大河机房 | 路由器 | | 大河机房 | 服务器 | | 大江机房 | 显示器 | | 大江机房 | 笔记本 | | 大江机房 | 路由器 | | 大江机房 | 服务器 | | 内网机房 | 台式机 | | 内网机房 | 显示器 | | 内网机房 | 笔记本 | | 内网机房 | 交换机 | | 内网机房 | 服务器 | +-----------------+------------------+ 14 rows in set (0.00 sec)
使用Django实现
area_type.objects.all().values("area_id__area_name","device_type_id__device_type_name")