归类设计model、app
- 通过类型区分model,放置到不同app的model块
- 例如如果是商城类型的网站设计:
- 商品 goods
- 交易 trade
- 用户 users
- 用户操作 userOperation
常用基础model知识
基础Field
- CharField
- DateField
- DateTimeField
- 关键参数:auto_now_add=True(在新增时创建时间之后不再变)和auto_now=True即mysql中的CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP
- BigIntegerField
- BinaryField
- DecimalField
- 关键参数:max_digits小数总长度/decimal_places(小数位长度)
- EmailField Admin和modelForm提供验证email的正则
- FileField
- 关键参数:upload_to=”path”上传文件保存路径,存储时以路径存到数据库
- FloatField
- IntegerField
- URLField Admin和modelForm中提供url验证
- IPAddressField Admin和modelForm中提供ipv4
- GenericIPAddressField Admin和modelForm中提供ipv4和ipv6的验证
- ImageField
- 关键参数:upload_to=”path”
- 常用参数
- null
- unique
- db_index
- default
关系Field
ForeignKey
- to
- “self”表示自关联
- to_field
- related_name
- 反向操作需要使用的字段名,用于代替默认的反向查询表名_set
- on_delete 当主表删除数据时,关联表所做行为
- CASECADE 串级删除
- DO_NOTHING 报IntegrityError
- PROTECT 报ProtectedError
- SET_NULL
- SET_DEFAULT
- SET(val)
- db_constraint
- to
ManytoManyField 与ForeinKey类似
model原信息meta
- db_table 名字
- index_together 联合索引
- unique_together 联合唯一索引
- ordering 指定默认按什么字段排序
第三方Field
pip install djangoUeditor(或github克隆)
- UEditorField(verbose_name=’’, imagePath=’’, filePath=’’, width=1000, height=300)
- 富文本编辑字段即可发图片、文本、文件。
模型继承
抽象基类
- 和python类继承类似,将子类的共同数据抽象出来继承充用,不会创建实际的数据表
- 如django.contrib.auth.models中的AbstractUser
多表继承
- 父类和子类都是独立自主、功能完整、可正常使用的模型,都有自己的数据表,但内部隐藏一个一对一关系
代理模型
- 在meta中声明proxy=True可以代理继承中的模型
多重继承
用户模型
引用用户模型
- 由于app添加了django.contrib.auth默认了自带的user,如果不自定义并在setting中修改,即会使用默认的user作为用户
- 自定义user须在setting中添加配置AUTH_USER_MODEL=’APP.XXXMODEL’,并继承AbstractUser
- 如果有别的model外键user,需要通过get_user_model()寻找user,即setting.AUTH_USER_MODEL
- 在migration时请确保user放在首位,解决Django的动态依赖
用户模型关键参数
USERNAME_FIELD
- 必须设置,且改field必须含有unique=True即USERNAME_FIELD = ‘字段名’
2.4.2.2 REQUIRED_FIELDS
- 设置list,如果设置,该字段为必填字段(主要用于createsuperuser时使用),REQUIRED_FIELDS = [‘date_of_birth’, ‘height’],还有一些方法可以继承原抽象user模型
自定义user管理器
- 大概是重写一下UserManager的几个方法如create_user/create_super_user
自定义用户和权限
- 用户权限一般包括增删改查某个model,权限名一般有app名(app_label),权限动作和模型名组成
分配权限与查看权限
- 查看权限
- user.has_perm(‘appname.operation_modelname’)
- user.get_group_permissions()
- user.get_all_permissions()
- 分配权限
- user.user_permissions = [permission1, permission2……]
- user.user_permissions.add(per1, per2)
- user.user_permissions.remove(per1, per2)
- user.uer_permissions.clear()
- 自定义权限
- 方法一:在model的meta中设置权限permissions=((“read_xxx”, “Can Read xxxx”),())
- 方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from blog.models import Article
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(article)
permission1 = Permission.objects.create(
codename='publish_article',
name='Can publish articles',
content_type=content_type,
)
permission2 = Permission.objects.create(
codename='comment_article',
name='Can comment articles',
content_type=content_type,
)
- 把用户添加到组
- 获取用户对象和组对象,因为是多对多关系,直接user.groups.add(g)即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35# 创建一个分组
Group.objects.create(name='reader')
# 获取某用户
u = User.objects.get(username='test_user')
# 获取某分组
g = Group.objects.get(name='reader')
# 把用户加入到分组中
u.groups.add(g)
# 获取某个权限
p= Permission.objects.get(codename='read_book')
# 把该权限加入到分组
g.permissions.add(p)
Group 还有其他操作:
# 把用户加入分组,group_list可以是一个或多个分组
u.groups = [group_list]
# 把用户加入某分组
u.groups.add(group, group, ...)
# 把某用户从某分组删除
u.groups.remove(group, group, ...)
# 该用户退出所以分组
u.groups.clear()
# 把权限加入到该分组
g.permissions.add(permission, permissions, ...)
g.permissions.remove(permission, permissions, ...)
g.permissions.clear()
- 获取用户对象和组对象,因为是多对多关系,直接user.groups.add(g)即可
- 视图权限控制
- 如果要使用自带的后台管理系统即需要注册各个model的admin,这里可以使用simpleui
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class GoodsAdmin(ImportExportActionModelAdmin, ImportExportModelAdmin):
resource_class = GoodsResource
list_filter = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
"shop_price", "is_new", "is_hot", "add_time", "category__name"]
list_display = ["name", "click_num", "sold_num", "fav_num", "goods_num", "market_price",
"shop_price", "goods_brief", "goods_desc", "is_new", "is_hot", "add_time"]
search_fields = ['name', ]
list_editable = ["is_hot", ]
# fieldsets = [
# (None, {'fields': ['name']}, ),
# (None, {'fields': ['goods_desc'], 'classes': ['collapse']}),
# ]
style_fields = {"goods_desc": "ueditor"}
class GoodsImagesInline(admin.StackedInline):
model = GoodsImage
exclude = ["add_time"]
extra = 1
style = 'tab'
inlines = [GoodsImagesInline, ]
admin.site.register(Goods, GoodsAdmin)
2.6 单独使用model
- 使用django的model进行测试,数据添加等操作时,需要:
- 1.获取当前路径,把当前路径加入sys
- 2.设置django setting为当前环境变量(os)
- 3.导入django并启动
- 4.导入app模型使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import sys
import os
import django
pwd = os.path.dirname(os.path.realpath(__file__))
sys.path.append(pwd+"../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MxShop.settings")
django.setup()
from goods.models import GoodsCategory, Goods
from db_tools.data.category_data import row_data
from django.db.models import Count, Max
a = Goods.objects.all().values('category').annotate(a=Max('market_price'))
b = Goods.objects.all().aggregate(a=Max('market_price'))