1. 表单建立
1.1 添加models
根据ORM模型,数据库的表项,对应编程中的属性。先上一波示例
# models.py
class Book(models.Model): #创建 book 表
title=models.CharField( max_length=30,unique=True, verbose_name='书名')
public=models.CharField(max_length=50,verbose_name='出版社')
price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='定价')
def default_price(self):
return '¥30'
retail_price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='零售价', default=default_price)
def __str__(self):
return "title:%s pub:%s price:%s" % (self.title, self.public, self.price)
class Author(models.Model): #创建作者表
name=models.CharField(max_length=30,verbose_name='姓名')
email=models.EmailField(verbose_name='邮箱')
def __str__(self):
return '作者:%s'%(self.name)
class UserInfo(models.Model): #创建用户信息表
username=models.CharField(max_length=24,verbose_name='用户注册')
password =models.CharField(max_length=24,verbose_name='密码')
choices = (
(u’M’, '男性'),
(u’F’, '女性'),
)
gender = models.CharField(max_length=2,choices = choices,default='male')
1.1.1 内部类
Django的模型类里面都包含一个内部类Meta,用于定义一些模型类的行为特性。
行为 | 说明 |
---|---|
abstract | 抽象类,不建具体的表项,用于归纳共有属性字段 |
proxy | 代理,一个数据库表需要对应多个操作页面 |
app_label | 如果你的模型不在默认的model.py下 |
db_table | 指定数据库中表的名称,Django默认为app_modelname |
ordering | 返回值按照什么来排序 |
verbose_name | 给你的表项创建一个更可读的中文名 |
verbose_name_plural | 指定模型的复数形式,默认加s |
1.1.2 定义属性和方法
比如,在库存管理系统中,确认库存是否充足,以便发出补货通知。需要多个属性进行关联
class XXX(models.Model):
...
@property # 定义属性
def method1(self):
pass
def method2(self, s): # 定义方法
pass
属性不带参数,可以直接用XXX.method1
属性带参数,需要用XXX.method2(s)
1.1.3 指定表象展示内容
工程中,通常会有多个表项关联,在表项展示时,我们需要指出表项输出的内容格式
class XXX(models.Model):
...
def __str__(self):
return '*'
1.2 数据库迁移
python manage.py makemigrations
python manage.py migrate
迁移后会生成一个临时文件
(venv) C:\Users\MI\PycharmProjects\BookStore>python manage.py makemigrations
Migrations for 'index':
index\migrations\0001_initial.py
- Create model Author
- Create model Book
- Create model UserInfo
(venv) C:\Users\MI\PycharmProjects\BookStore>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, index, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying index.0001_initial... OK
Applying sessions.0001_initial... OK
(venv) C:\Users\MI\PycharmProjects\BookStore>
1.3 添加超级用户
python manage.py createsuperuser --username=admin
也可以不指定username
(venv) C:\Users\MI\PycharmProjects\BookStore>python manage.py createsuperuser --username=admin --email=Jimmy_nuaa@163.com
Password:
Password (again):
Superuser created successfully.
(venv) C:\Users\MI\PycharmProjects\BookStore>
2 数据库访问
在默认的Admin系统管理中,程序员和用户无需知晓数据库的访问和页面跳转。实际使用中,离不开诸多扩展,也由此需要了解数据库的操作,大体离不开增删改查四部曲。
2.1 增
# 1 create 方法
xClass.objects.create(X=x, Y=y)
# 2 save 方法
obj = xClass(X=x, Y=y)
obj.save()
2.2 查
2.2.1 获取所有
xClass.objects.all()
2.2.2 条件查询
xClass.objects.get(X=x, Y=y)
2.2.3 过滤查询
- filter 过滤出多个结果
- exclude 排除掉符合条件剩下的结果
- get 过滤单一结果
属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
This is a regular paragraph.
<table>
<tr>
<td>Foo</td>
</tr>
</table>
This is another regular paragraph.
操作 | 关键词 |
---|---|
相等 | exact 或忽略 |
模糊查询 [colspace = 3] | contains: 包含 |
模糊查询 [colspace = 3] | startwith: 起始于 |
模糊查询 [colspace = 3] | stopwith: 终止于 |
空查询 | isnull: 是否为空 |
比较查询 | gt: 大于 |
比较查询 | gte: 大于等于 |
比较查询 | lt: 小于 |
比较查询 | lte: 小于等于 |
范围查询 | in: 范围内 |
2.3 改
2.3.1 save 方法
obj = xClass.object.get(X=x)
obj.Y = y
obj.save()
2.3.2 update方法
obj = xClass.object.get(X=x).update(Y=y)
2.4 删
删除直接用delete,
obj = xClass.object.get(X=x).delete
2.5 数据类型
Django对数据库的访问,返回值为QuerySet,又称查询集
3 将表单加入到系统自带界面进行管理
3.1 模型注册
模型纳入admin中管理有几种方法:
a. 直接注册
from django.contrib import admin
# Register your models here.
from .models import xClass
admin.site.register(xClass)
b. 使用装饰器
from django.contrib import admin
@admin.register(xClass)
class xClass(admin.ModelAdmin):
list_display = (……)
c. 其他
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'display_genre')
inlines = [BooksInstanceInline]
admin.site.register(Book, BookAdmin)
3.2 ModelAdmin常用参数
3.2.1 标配
选项 | 说明 |
---|---|
list_display | 控制展示字段,多对多字段受限 |
search_field | 配置在前端可查询的字段 |
list_filter | 设置过滤字段 |
actions | 添加自定义动作 |
@admin.register(Stock)
class StockAdmin(admin.ModelAdmin):
list_display = [……]
search_fields = [……
list_display_links = None
3.2.2 权限设置
对增删查改操作进行设置,从而实现管理与控制分离。
def has_change_permission(self, request, obj=None):
return None
3.2.3 自定义字段的展示
Admin管理中表单通常采用相同的渲染,但很多时候,需要进行差异化的显示,以反馈信息为例,用不同颜色区分信息、公告、警告、危险等 级别
网友评论