Django 数据库查询

本文介绍了在Django 1.8.0中如何进行数据库查询,包括查询表中指定字段和进行关联查询。通过QuerySet对象.values()方法,可以实现SQL查询的指定字段功能和多表关联查询。以机房和设备类型的多对多关系为例,展示了如何查询每个机房对应的设备ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中多表关联查询的功能:

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为机房表,device_type设备类型表.

一个机房可以有多种设备类型,一种设备类型也可以存在于多个机房中,所以两者为多对多关系.表area_type为两者的关系表.

(1) 查询每个机房对应的设备id

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)
使用Django实现

area_type.objects.all().values("area_id__area_name","device_type_id")
(2) 查询每个机房对应的设备名称

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")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值