[Dynamic Language] Python Django: 模型使用

本文介绍如何使用 Django 框架进行模型定义、数据库操作及数据检索等实战技巧,包括模型创建、数据增删改查的基本操作。

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

Django 模型

//创建App应用程序
python manage.py startapp books

//建立模型

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
1 from django.db import models
2
3 # Create your models here.
4
5 class Publisher(models.Model):
6 name = models.CharField(max_length = 30 )
7 address = models.CharField(max_length = 50 )
8 city = models.CharField(max_length = 60 )
9 state_province = models.CharField(max_length = 30 )
10 country = models.CharField(max_length = 50 )
11 website = models.URLField()
12
13 class Author(models.Model):
14 first_name = models.CharField(max_length = 100 )
15 last_name = models.CharField(max_length = 40 )
16 email = models.EmailField()
17
18 class Book(models.Model):
19 title = models.CharField(max_length = 100 )
20 authors = models.ManyToManyField(Author)
21 publisher = models.ForeignKey(Publisher)
22 publication_date = models.DateField()

模型安装
修改 settings.py 配置信息

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
70 MIDDLEWARE_CLASSES = (
71 # 'django.middleware.common.CommonMiddleware',
72 # 'django.contrib.sessions.middleware.SessionMiddleware',
73 # 'django.middleware.csrf.CsrfViewMiddleware',
74 # 'django.contrib.auth.middleware.AuthenticationMiddleware',
75 # 'django.contrib.messages.middleware.MessageMiddleware',
76 )
88 INSTALLED_APPS = (
89 # 'django.contrib.auth',
90 # 'django.contrib.contenttypes',
91 # 'django.contrib.sessions',
92 ' django.contrib.sites ' ,
93 # 'django.contrib.messages',
94 ' mysite.books ' ,
95 # Uncomment the next line to enable the admin:
96 # 'django.contrib.admin',
97 )

//验证模型的有效性


  
abeen@localhost: ~/ django_test / mysite$ python manage.py validate
0 errors found

//打印输出sql语句

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
abeen@localhost: ~/ django_test / mysite$ python manage.py sqlall books
BEGIN;
CREATE TABLE `books_publisher` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(
30 ) NOT NULL,
`address` varchar(
50 ) NOT NULL,
`city` varchar(
60 ) NOT NULL,
`state_province` varchar(
30 ) NOT NULL,
`country` varchar(
50 ) NOT NULL,
`website` varchar(
200 ) NOT NULL
);
CREATE TABLE `books_author` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`first_name` varchar(
100 ) NOT NULL,
`last_name` varchar(
40 ) NOT NULL,
`email` varchar(
75 ) NOT NULL
);
CREATE TABLE `books_book_authors` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`book_id` integer NOT NULL,
`author_id` integer NOT NULL,
UNIQUE (`book_id`, `author_id`)
);
ALTER TABLE `books_book_authors` ADD CONSTRAINT `author_id_refs_id_9e7e386`
FOREIGN KEY (`author_id`) REFERENCES `books_author` (`
CREATE TABLE `books_book` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` varchar(
100 ) NOT NULL,
`publisher_id` integer NOT NULL,
`publication_date` date NOT NULL
);
ALTER TABLE `books_book` ADD CONSTRAINT `publisher_id_refs_id_c5b274bb`
FOREIGN KEY (`publisher_id`) REFERENCES `books_publisher`
ALTER TABLE `books_book_authors` ADD CONSTRAINT `book_id_refs_id_cfbcf262`
FOREIGN KEY (`book_id`) REFERENCES `books_book` (`id`);
CREATE INDEX `books_book_22dd9c39` ON `books_book` (`publisher_id`);
COMMIT;

//同步模型到数据库

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
abeen@localhost: ~/ django_test / mysite$ python manage.py syncdb
Creating table books_publisher
Creating table books_author
Creating table books_book_authors
Creating table books_book
Installing index
for books.Book_authors model
Installing index
for books.Book model
No fixtures found.

基本数据访问

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 1 ]: from books.models import Publisher // 导入
// 创建对象
In [
2 ]: p = Publisher(name = ' Apress ' ,address = ' 2855,Telegraph Avenue ' ,city = ' Berkeley ' ,
state_province
= ' CA ' ,country = ' USA ' ,website = ' http://www.jinry.com ' )
// 存入数据库
In [
3 ]: p.save()
In [
4 ]: p2 = Publisher(name = ' Apress ' ,address = ' 2855,Telegraph Avenue ' ,city = ' Berkeley ' ,
state_province
= ' CA ' ,country = ' USA ' ,website = ' http://www.jinry.com ' )
In [
5 ]: p2.save()
// 取信息
In [
6 ]: publisher_list = Publisher.objects.all()
In [
7 ]: publisher_list
Out[
7 ]: [ < Publisher: Publisher object > , < Publisher: Publisher object > ]
In [
8 ]: type(publisher_list)
Out[
8 ]: < class ' django.db.models.query.QuerySet ' >

// 创建并直接存入数据库
In [
9 ]: p2 = Publisher.objects.create(name = ' Apress ' ,address = ' 2855,Telegraph Avenue ' ,
city
= ' Berkeley ' ,state_province = ' CA ' ,country = ' USA ' ,website = ' http://www.jinry.com ' )

选择对象集


  
In [ 9 ]: publisher_list = Publisher.objects.all()//取全部
In [
10 ]: publisher_list
Out[
10 ]: [ < Publisher: abeen > , < Publisher: shanshan > , < Publisher: Apress > ]

数据过滤

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 16 ]: publisher = Publisher.objects.filter(name = " abeen " )
In [
17 ]: publisher
Out[
17 ]: [ < Publisher: abeen > ]
//sql and

In [ 21 ]: publishers = Publisher.objects.filter(name = " abeen " , city = " hai dian " )

In [
22 ]: publishers
Out[
22 ]: [ < Publisher: abeen > ]
In [
23 ]: publishers = Publisher.objects.filter(name__contains = " a " ) // 包含关系
In [
25 ]: publishers
Out[
25 ]: [ < Publisher: abeen > , < Publisher: shanshan > ]

获取单个对象


  
In [ 27 ]: p = Publisher.objects.get(name = " abeen " )
In [
28 ]: p
Out[
28 ]: < Publisher: abeen >

注意get在取不到结果或取到多个结果时,会报DoesNotExist错误,程序要自己处理。如:

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 30 ]: try :
....: p
= Publisher.objects.get(name = " abeen1 " )
....:
except Publisher.DoesNotExist:
....:
print " abeen1 is not in "
....:
else :
....: p
....:
....:
abeen1
is not in

数据排序

ContractedBlock.gif ExpandedBlockStart.gif 数据排序

   
In [ 39 ]: Publisher.objects.all()
Out[
39 ]: [ < Publisher: abeen > , < Publisher: shanshan > , < Publisher: Apress > ,
 
< Publisher: binbin > , < Publisher: qiqi > , < Publisher: lanlan > ]
In [
40 ]: Publisher.objects.order_by( " name " ) // 按name排序
Out[
40 ]: [ < Publisher: abeen > , < Publisher: Apress > , < Publisher: binbin > ,
<
Publisher: lanlan > , < Publisher: qiqi > , < Publisher: shanshan > ]
In [
41 ]: Publisher.objects.order_by( " name " , " city " ) // 多字段排序
Out[
41 ]: [ < Publisher: abeen > , < Publisher: Apress > , < Publisher: binbin > ,
< Publisher: lanlan > , < Publisher: qiqi > , < Publisher: shanshan > ]
In [
42 ]: Publisher.objects.order_by( " -name " ) // 逆向排序,在前面加一个减号 - 前缀
Out[
42 ]: [ < Publisher: shanshan > , < Publisher: qiqi > , < Publisher: lanlan > ,
<
Publisher: binbin > , < Publisher: Apress > , < Publisher: abeen > ]

如果感觉每次查询都要写order_by啰嗦的话,可以用Meta来设置模型默认的排序字段

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
5 class Publisher(models.Model):
6 name = models.CharField(max_length = 30 )
7 address = models.CharField(max_length = 50 )
8 city = models.CharField(max_length = 60 )
9 state_province = models.CharField(max_length = 30 )
10 country = models.CharField(max_length = 50 )
11 website = models.URLField()
12
13 def __unicode__ (self):
14 return self.name
15
16 class Meta:
17 ordering = [ ' name ' ]

查询看一下结果默认按name排序了

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 1 ]: from books.models import Publisher
In [
2 ]: P = Publisher
In [
3 ]: P.objects.all()
Out[
3 ]: [ < Publisher: abeen > , < Publisher: Apress > , < Publisher: binbin > ,
< Publisher: lanlan > , < Publisher: qiqi > , < Publisher: shanshan > ]

注意可以在任意一个模型类中使用 Meta 类,来设置一些与特定模型相关的选项。
(参考与特定模型相关选项 http://djangobook.py3k.cn/appendixB/

 

连锁查询


  
In [ 5 ]: p = Publisher.objects.filter(name__contains = " a " ).order_by( " name " )
In [
6 ]: p
Out[
6 ]: [ < Publisher: abeen > , < Publisher: lanlan > , < Publisher: shanshan > ]

限制返回的数据

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 7 ]: Publisher.objects.all()[ 1 ] // 按索引号取
Out[
7 ]: < Publisher: Apress >
In [
8 ]: Publisher.objects.all()[0: 2 ] // 按范围取
Out[
8 ]: [ < Publisher: abeen > , < Publisher: Apress > ]
In [
9 ]: Publisher.objects.all().order_by( " -name " )[0: 2 ] // 不支持负索引,可以后逆排实现效果
Out[
9 ]: [ < Publisher: shanshan > , < Publisher: qiqi > ]

更新多个对象


  
In [ 11 ]: p = Publisher.objects.get(name = " abeen " )
In [
12 ]: p
Out[
12 ]: < Publisher: abeen >
In [
13 ]: p.name = " new abeen "
In [
14 ]: p.save() // 将所有字段都更新,即使只修改某个字段

先看一下数据库数据

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
mysql > select * from books_publisher;
+----+-----------+-----------------------+------------+----------------+---------+----------------------+
| id | name | address | city | state_province | country | website |
+----+-----------+-----------------------+------------+----------------+---------+----------------------+
| 1 | new abeen | 2855 ,Telegraph Avenue | hai dian | CA | USA | http: // www.jinry.com |
| 2 | shanshan | 2855 ,Telegraph Avenue | feng tai | CA | USA | http: // www.jinry.com |
| 3 | Apress | 2855 ,Telegraph Avenue | Berkeley | CA | USA | http: // www.jinry.com |
| 4 | binbin | | shou guang | | | |
| 5 | qiqi | | shou guang | | | |
| 6 | lanlan | | shou guang | | | |
+----+-----------+-----------------------+------------+----------------+---------+----------------------+
In [ 16 ]: Publisher.objects. filter (id = " 1 " ).update(name = " abeen " )
Out[
16 ]: 1L
In [ 17 ]: Publisher.objects.all().update(website = " http://www.jinry.com " )
Out[
17 ]: 6L

数据已修改

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
mysql > select * from books_publisher;
+----+----------+-----------------------+------------+----------------+---------+----------------------+
| id | name | address | city | state_province | country | website |
+----+----------+-----------------------+------------+----------------+---------+----------------------+
| 1 | abeen | 2855 ,Telegraph Avenue | hai dian | CA | USA | http: // www.jinry.com |
| 2 | shanshan | 2855 ,Telegraph Avenue | feng tai | CA | USA | http: // www.jinry.com |
| 3 | Apress | 2855 ,Telegraph Avenue | Berkeley | CA | USA | http: // www.jinry.com |
| 4 | binbin | | shou guang | | | http: // www.jinry.com |
| 5 | qiqi | | shou guang | | | http: // www.jinry.com |
| 6 | lanlan | | shou guang | | | http: // www.jinry.com |
+----+----------+-----------------------+------------+----------------+---------+----------------------+

删除对象


  
In [ 18 ]: Publisher.objects. filter (name = " lanlan " ).delete()
In [ 19 ]: p = Publisher.objects.get(name = " binbin " )
In [ 20 ]: p.delete()

//删除表数据时要注意,显示调用all(),否则会出如下错误

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
In [ 21 ]: Publisher.objects.delete()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/ home / abeen / django_test / mysite / <ipython console > in <module > ()
AttributeError: 'Manager' object has no attribute 'delete'

// 删除表内全部数据
In [ 22 ]: Publisher.objects.all().delete()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值