网站开发制作公司有哪些,成都公司注册哪家好,网站在线推广,asp.net网站开发教程一.过滤器
1.过滤器格式
{{变量|过滤器名字}}
2.怎么使用 1.注册app 2.在app下创建templatetags模块#xff08;模块名只能是templatetags#xff09; 3.在包下写一个py文件#xff0c;随便命名 4.在py文件中写入#xff1a;from django import template …一.过滤器
1.过滤器格式
{{变量|过滤器名字}}
2.怎么使用 1.注册app 2.在app下创建templatetags模块模块名只能是templatetags 3.在包下写一个py文件随便命名 4.在py文件中写入from django import template register template.Library() # register的名字是固定的不可改变 5.定义自己的标签或过滤器 register.filter def filter_words(content: str) - str: l [妈的, 傻逼, 退游] # 把content中所有关键词替换返回 for item in l: content content.replace(item, **) return content register.simple_tag def my_input(id,arg): result input typetext id%s class%s / %(id,arg) return mark_safe(result) 6.在模板中使用: {% load common_filter %} 使用 p{{ content|filter_words}}/p {% my_input 7 red %} 二. 模型层
1.基本使用 1. ORM框架 ---- 对象关系映射 数据库中一个个表user表book表一条条的记录 程序中一个个类一个个对象 以后数据库中一张表对应程序中一个类 以后数据库中一条记录对应程序中一个对象 2.数据库表中字段有很多类型intvarchartext 程序的类中字段也有很多类型CharFieldDecimalField from django.db import models
# 写一个个类class Book(models.Model):id models.AutoField(primary_keyTrue)title models.CharField(max_length64, nullFalse)price models.DecimalField(max_digits7, decimal_places2)# 执行命令
python manage.py makemigrations
python manage.py migrate
2.常用和非常用字段
AutoField(Field)- int自增列必须填入参数 primary_keyTrueBigAutoField(AutoField)- bigint自增列必须填入参数 primary_keyTrue注当model中如果没有自增列则自动会创建一个列名为id的列from django.db import modelsclass UserInfo(models.Model):# 自动创建一个列名为id的且为自增的整数列username models.CharField(max_length32)class Group(models.Model):# 自定义自增列nid models.AutoField(primary_keyTrue)name models.CharField(max_length32)
SmallIntegerField(IntegerField):- 小整数 -32768 32767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整数 0 32767
IntegerField(Field)- 整数列(有符号的) -2147483648 2147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整数 0 2147483647BigIntegerField(IntegerField):- 长整型(有符号的) -9223372036854775808 9223372036854775807BooleanField(Field)- 布尔值类型NullBooleanField(Field):- 可以为空的布尔值CharField(Field)- 字符类型- 必须提供max_length参数 max_length表示字符长度TextField(Field)- 文本类型EmailField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证机制IPAddressField(Field)- 字符串类型Django Admin以及ModelForm中提供验证 IPV4 机制URLField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证 URLSlugField(CharField)- 字符串类型Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符减号CommaSeparatedIntegerField(CharField)- 字符串类型格式必须为逗号分割的数字UUIDField(Field)- 字符串类型Django Admin以及ModelForm中提供对UUID格式的验证FilePathField(Field)- 字符串Django Admin以及ModelForm中提供读取文件夹下文件的功能- 参数path, 文件夹路径matchNone, 正则匹配recursiveFalse, 递归下面的文件夹allow_filesTrue, 允许文件allow_foldersFalse, 允许文件夹FileField(Field)- 字符串路径保存在数据库文件上传到指定目录- 参数upload_to 上传文件的保存路径storage None 存储组件默认django.core.files.storage.FileSystemStorageImageField(FileField)- 字符串路径保存在数据库文件上传到指定目录- 参数upload_to 上传文件的保存路径storage None 存储组件默认django.core.files.storage.FileSystemStoragewidth_fieldNone, 上传图片的高度保存的数据库字段名字符串height_fieldNone 上传图片的宽度保存的数据库字段名字符串DateTimeField(DateField)- 日期时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式 YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 时间格式 HH:MM[:ss[.uuuuuu]]DurationField(Field)- 长整数时间间隔数据库中按照bigint存储ORM中获取的值为datetime.timedelta类型FloatField(Field)- 浮点型DecimalField(Field)- 10进制小数- 参数max_digits小数总长度decimal_places小数位长度BinaryField(Field)- 二进制类型
3.常用和非常用字段参数
# null
如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
# blank 后台管理---》admin中会用咱们一般用的少
如果为True该字段允许不填。默认为False。
要注意这与 null 不同。null纯粹是数据库范畴的而 blank 是数据验证范畴的。
如果一个字段的blankTrue表单的验证将允许该字段是空值。如果字段的blankFalse该字段就是必填的。# default
字段的默认值。可以是一个值或者可调用对象。如果可调用 每有新对象被创建它都会被调用。# primary_key
如果为True那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_keyTrue
Django 就会自动添加一个IntegerField字段做为主键所以除非你想覆盖默认的主键行为
否则没必要设置任何一个字段的primary_keyTrue。# unique
如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的# db_index 该字段建立索引# choices
由二元组组成的一个可迭代对象例如列表或元组用来给字段提供选择项。 如果设置了choices 默认的表单将是一个选择框而不是标准的文本框br而且这个选择框的选项就是choices 中的选项。
get_type_book_display()# 关于Meta中
class UserInfo(models.Model):nid models.AutoField(primary_keyTrue,indexTrue)username models.CharField(max_length32)mobilemodels.CharField(max_length32)class Meta:# 数据库中生成的表名称 默认 app名称 下划线 类名db_table table_name# 联合索引index_together [(username, mobile),]# 联合唯一索引unique_together ((username, mobile),)# admin中显示的表名称verbose_name图书表# verbose_name加sverbose_name_plural4.settings配置
# orm 可以操作sqlitemysqloraclepostgresql。。。。# 配置文件中的配置
### 默认配置操作sqlite
DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite_lqz,}
}#### 操作mysql
# 配置文件
DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: day05,HOST:127.0.0.1,PORT:3306,USER:root,PASSWORD:1234,}
}#装模块pymsql模块mysqlclientpip3 install mysqlclient #其他不需要任何操作----》有可能在你机器装不上macpip3 install pymysql --upgrade# 保证它执行放在配置文件中import pymysqlpymysql.install_as_MySQLdb()
5.基本操作增删改查
# 增加删除字段只需要在表模型增加注释字段增加删除字段参数再迁移就可以了
*******不要轻易删除迁移记录*********# 增加表记录-方式一Book.object.create()-方式二bookBook(参数)book.save()# 删除记录-方式一查出来再删Book.object.all().delete()-方式二重写类中的delete方法bookBook.object.filter(pk1).first()book.delete() # Book类中有个delete方法咱们没有写父类可以重写# 改更新-方式一先查再删Book.objects.all().update()-方式二bookBook.object.filter(pk1).first()book.nameXXXbook.save()# 查
all(): 查询所有结果
filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
get(**kwargs): 返回与所给筛选条件相匹配的对象返回结果有且只有一个如果符合筛选条件的对象超过一个或者没有都会抛出错误
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
order_by(*field): 对查询结果排序
reverse() 对查询结果反向排序
count() 返回数据库中匹配查询QuerySet的对象数量
first(): 返回第一条记录
last(): 返回最后一条数据6.多表操作-创建关系
class Book(models.Model):name models.CharField(max_length32)price models.DecimalField(max_digits5, decimal_places2)publish_date models.DateField()publish models.ForeignKey(toPublish,on_deletemodels.CASCADE)#这不是个字段authorsmodels.ManyToManyField(toAuthor)def __str__(self):return self.nameclass Author(models.Model):name models.CharField(max_length32)age models.IntegerField()author_detail models.OneToOneField(toAuthorDatail,uniqueTrue,on_deletemodels.CASCADE)class AuthorDatail(models.Model):telephone models.BigIntegerField()birthday models.DateField()addr models.CharField(max_length64)class Publish(models.Model):name models.CharField(max_length32)city models.CharField(max_length32)email models.EmailField() 关联关系有哪几种 一对一本质就是一对多只不过多里面的字段唯一 一对多外键关联 多对多必须有中间表 注意
# OneToOneField,ForeignKey 必须写on_delete,不写会报错on_delete可选的参数有哪些#1. models.CASCADE 级联删除----删除出版社----当前出版社下所有的书都会被删除#2. models.SET_NULL 删除出版社----当前出版社下所有的图书数据publish_id字段都被置为空publish models.ForeignKey(toPublish,on_deletemodels.SET_NULL,nullTrue)#3. models.SET_DEFAULT 删除出版社----当前出版社下所有的图书数据都会publish_id字段设为默认值publish models.ForeignKey(toPublish,on_deletemodels.SET_DEFAULT,default1) #4. models.SER(值/可调用对象)删除出版社----当前出版社下所有的图书数据都会被publish_id字段设为SET传入的值如果是可调用对象会执行可调用对象把return变#5. models.DO_NOTHING 删除出版社---当前出版社下所有的图书数据的publish_id字段原封不动publish models.ForeignKey(toPublish,on_deletemodels.DO_NOTHING,db_constraintFalse)
7.基于对象跨表查询
1一对多查询publish与book
正向查询按字段publish
# 查询主键为1的书籍的出版社所在的城市
book_objBook.objects.filter(pk1).first()
# book_obj.publish 是主键为1的书籍对象关联的出版社对象
print(book_obj.publish.city)
反向查询按表名book_set
publishPublish.objects.get(name苹果出版社)
#publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合
book_listpublish.book_set.all()
for book_obj in book_list:print(book_obj.title)
# 一对多正向查询bookBook.objects.filter(name红楼梦).first()print(book.publish)#与这本书关联的出版社对象print(book.publish.name)# 一对多反向查询# 人民出版社出版过的书籍名称pubPublish.objects.filter(name人民出版社).first()retpub.book_set.all()print(ret)
2一对一查询Author与AuthorDetail
正向查询按字段authorDetail
justinAuthor.objects.filter(namejustin).first()
print(justin.authorDetail.telephone)
反向查询按表名author
# 查询所有住址在北京的作者的姓名authorDetail_listAuthorDetail.objects.filter(addrbeijing)
for obj in authorDetail_list:print(obj.author.name)
# 一对一正向查询
# lqz的手机号
lqzAuthor.objects.filter(namelqz).first()
tellqz.author_detail.telephone
print(tel)
# 一对一反向查询
# 地址在北京的作者姓名
author_detailAuthorDatail.objects.filter(addr北京).first()
nameauthor_detail.author.name
print(name)
3多对多查询Author与Book
正向查询按字段authors
# 眉所有作者的名字以及手机号book_objBook.objects.filter(title眉).first()
authorsbook_obj.authors.all()
for author_obj in authors:print(author_obj.name,author_obj.authorDetail.telephone)
反向查询按表名book_set
# 查询justin出过的所有书籍的名字author_objAuthor.objects.get(namejustin)book_listauthor_obj.book_set.all() #与justin作者相关的所有书籍for book_obj in book_list:print(book_obj.title)
# 正向查询----查询红楼梦所有作者名称
bookBook.objects.filter(name红楼梦).first()
retbook.authors.all()
print(ret)
for auth in ret:
print(auth.name)
# 反向查询 查询lqz这个作者写的所有书
authorAuthor.objects.filter(namelqz).first()
retauthor.book_set.all()
print(ret)