Django字段、参数、打印原生sql、查询表记录API、基于双下划线的模糊查询、单表操作、python脚本中调用django环境、时区和国际化问题及管理后台的简单使用

1、字段

AutoField(Field)
	int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
	bigint自增列,必须填入参数 primary_key=True: 当model中如果没有自增列,则自动会创建一个列名为id的列
    from django.db import models
	class UserInfo(models.Model):
        # 自动创建一个列名为id的且为自增的整数列
        username = models.CharField(max_length=32)
        
    class Group(models.Model):
        # 自定义自增列
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)

SmallIntegerField(IntegerField):
	小整数 -3276832767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
	正小整数 032767
	
IntegerField(Field)
	整数列(有符号的) -21474836482147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
	正整数 02147483647

BigIntegerField(IntegerField):
	长整型(有符号的) -92233720368547758089223372036854775807

BooleanField(Field)
	布尔值类型

NullBooleanField(Field):
	可以为空的布尔值

CharField(Field)
	字符类型
	必须提供max_length参数, max_length表示字符长度

TextField(Field)
	文本类型

EmailField(CharField):
	字符串类型,Django Admin以及ModelForm中提供验证机制

IPAddressField(Field)
	字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

GenericIPAddressField(Field)
	字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
	参数:
		protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
		unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

URLField(CharField)
	字符串类型,Django Admin以及ModelForm中提供验证 URL

SlugField(CharField)
	字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

CommaSeparatedIntegerField(CharField)
	字符串类型,格式必须为逗号分割的数字

UUIDField(Field)
	字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

FilePathField(Field)
	字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
	参数:
         path,                      文件夹路径
         match=None,                正则匹配
         recursive=False,           递归下面的文件夹
         allow_files=True,          允许文件
         allow_folders=False,       允许文件夹

FileField(Field)
	字符串,路径保存在数据库,文件上传到指定目录
	参数:
         upload_to = ""      上传文件的保存路径
         storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

ImageField(FileField)
	字符串,路径保存在数据库,文件上传到指定目录
	参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
        width_field=None    上传图片的高度保存的数据库字段名(字符串)
        height_field=None   上传图片的宽度保存的数据库字段名(字符串)

DateTimeField(DateField)
	日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
	日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
	时间格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
	长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

FloatField(Field)
	浮点型

DecimalField(Field)
	10进制小数
	参数:
         max_digits,小数总长度
         decimal_places,小数位长度

BinaryField(Field)
	二进制类型

总结,最常用字段

IntegerField 整数
AutoField
BooleanField
CharField
DateField
DateTimeField
DecimalField
FileField 上传文件,本质是varchar
ImageField 图片,本质是varchar,继承了FileField
TextField 存大文本
EmailField 本质是varchar

2、字段参数

null                数据库中字段是否可以为空
db_column           数据库中字段的列名
db_tablespace
default             数据库中字段的默认值
primary_key         数据库中字段是否为主键
db_index            数据库中字段是否可以建立索引
unique              数据库中字段是否可以建立唯一索引
unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
unique_for_year     数据库中字段【年】部分是否可以建立唯一索引

verbose_name        Admin中显示的字段名称
blank               Admin中是否允许用户输入为空
editable            Admin中是否可以编辑
help_text           Admin中该字段的提示信息
choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                    如: book = models.IntegerField(choices=[(0, '西游记'),(1, '红楼梦'),],default=1)

error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                    字典健: null, blank, invalid, invalid_choice, unique, and unique_for_date
                    如: {'null': "不能为空.", 'invalid': '格式错误'}

validators          自定义错误验证(列表类型),从而定制想要的验证规则
                    from django.core.validators import RegexValidator
                    from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
                    MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                    如:
                        test = models.CharField(
                            max_length=32,
                            error_messages={
                                'c1': '优先错信息1',
                                'c2': '优先错信息2',
                                'c3': '优先错信息3',
                            },
                            validators=[
                                RegexValidator(regex='root_\d+', message='错误了', code='c1'),
                                RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
                                EmailValidator(message='又错误了', code='c3'), ]
                        )

总结,最常用参数

null
max_length
default
primary_key
unique
db_index
choices
blank: django admin里提交数据,限制

元数据

class Meta:
db_table = “表名”
# 联合索引
index_together = [
(“name”, “publish”),
]
# 联合唯一索引
unique_together = ((“name”, “publish”),)
# admin中显示的表名称
verbose_name=‘xx表’ # verbose_name加s
verbose_name_plural=‘xx表’

3、打印原生sql

# 在settings中配置:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

4、查询表记录API

4.1、all()
# 查询所有,返回queryset对象
res = Book.objects.all()  # <QuerySet [<Book: Book object>]>
print(res)  # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` LIMIT 21; args=()
4.2、filter()
# 它包含了与所给筛选条件相匹配的对象
res = Book.objects.filter(name='西游记')  # <QuerySet [<Book: 西游记>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '西游记' LIMIT 21; args=('西游记',)
# 等同于下面这种
res = Book.objects.all().filter(name='西游记')
print(res)
4.3、get()
# 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
res = Book.objects.get(name='水浒传')  # Book object
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '水浒传'; args=('水浒传',)
# 等同于下面这种
res = Book.objects.filter(name='水浒传').get()
print(res)
4.4、exclude
# 它包含了与所给筛选条件不匹配的对象,排除,返回queryset对象,可以链式调用
res = Book.objects.exclude(publish='中国出版社')  # <QuerySet [<Book: Book object>, <Book: Book object>]>
print(res)  # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE NOT (`Book`.`publish` = '中国出版社') LIMIT 21; args=('中国出版社',)
4.5、order_by
# 排序(字段先后,存在顺序)  加-表示降序
res = Book.objects.order_by('price')  # <QuerySet [<Book: 水浒传>, <Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`price` ASC LIMIT 21; args=()

res = Book.objects.order_by('-price')  # <QuerySet [<Book: 封神榜>, <Book: 西游记>, <Book: 三国演义>, <Book: 红楼梦>, <Book: 水浒传>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`price` DESC LIMIT 21; args=()
4.6、reverse
# 反向,必须结合order_by使用,对查询结果反向排序
res = Book.objects.order_by('id').reverse()  # <QuerySet [<Book: 封神榜>, <Book: 西游记>, <Book: 水浒传>, <Book: 三国演义>, <Book: 红楼梦>]>
print(res)  # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` ORDER BY `Book`.`id` DESC LIMIT 21; args=()
4.7、count
# 统计条数,不是QuerySet对象,返回数据库中匹配查询(QuerySet)的对象数量
res = Book.objects.exclude(publish='中国出版社').count()  # 2
print(res)  # (0.001) SELECT COUNT(*) AS `__count` FROM `Book` WHERE NOT (`Book`.`publish` = '中国出版社'); args=('中国出版社',)
4.8、first
# 返回第一条记录,不是QuerySet对象
res = Book.objects.filter(publish='中国出版社').first()  # 红楼梦
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' ORDER BY `Book`.`id` ASC LIMIT 1; args=('中国出版社',)
4.9、last
# 返回最后一条记录,不是QuerySet对象
res = Book.objects.filter(publish='中国出版社').last()  # 西游记
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' ORDER BY `Book`.`id` DESC LIMIT 1; args=('中国出版社',)
4.10、exists
# 判断结果有没有值,不是QuerySet对象
res = Book.objects.filter(name='红楼梦').exists()  # True
print(res)  # (0.000) SELECT (1) AS `a` FROM `Book` WHERE `Book`.`name` = '红楼梦' LIMIT 1; args=('红楼梦',)

res = Book.objects.filter(name='神雕侠侣').exists()  # False
print(res)  # (0.000) SELECT (1) AS `a` FROM `Book` WHERE `Book`.`name` = '神雕侠侣' LIMIT 1; args=('神雕侠侣',)
4.11、values
# 指定只查某几个字段,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列
res = Book.objects.filter(publish='中国出版社').values('name','publish')  # <QuerySet [{'name': '三国演义', 'publish': '中国出版社'}, {'name': '红楼梦', 'publish': '中国出版社'}, {'name': '西游记', 'publish': '中国出版社'}]>
print(res)  # (0.001) SELECT `Book`.`name`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' LIMIT 21; args=('中国出版社',)
4.12、values_list
# 指定只查某几个字段,它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
res = Book.objects.filter(publish='中国出版社').values_list('name','publish')  # <QuerySet [('三国演义', '中国出版社'), ('红楼梦', '中国出版社'), ('西游记', '中国出版社')]>
print(res)  # (0.001) SELECT `Book`.`name`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish` = '中国出版社' LIMIT 21; args=('中国出版社',)
4.13、distinct
# 从返回结果中剔除重复纪录
res = Book.objects.values('publish').distinct()  # <QuerySet [{'publish': '中国出版社'}, {'publish': '上海出版社'}, {'publish': '北京出版社'}]>
print(res)  # (0.001) SELECT DISTINCT `Book`.`publish` FROM `Book` LIMIT 21; args=()

res = Book.objects.values('publish','name').distinct()  # <QuerySet [{'publish': '中国出版社', 'name': '三国演义'}, {'publish': '上海出版社', 'name': '封神榜'}, {'publish': '北京出版社', 'name': '水浒传'}, {'publish': '中国出版社', 'name': '红楼梦'}, {'publish': '中国出版社', 'name': '西游记'}]>
print(res)  # (0.001) SELECT DISTINCT `Book`.`publish`, `Book`.`name` FROM `Book` LIMIT 21; args=()

5、基于双下划线的模糊查询

5.1、in
# 在指定范围内
res = Book.objects.filter(price__in=['29.96', '59.01', '11.99'])  # <QuerySet [<Book: 红楼梦>, <Book: 西游记>]>
print(res)  # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` IN (11.99, 29.96, 59.01) LIMIT 21; args=(Decimal('11.99'), Decimal('29.96'), Decimal('59.01'))
5.2、gt、lt、gte、lte
# 大于,小于,大于等于,小于等于
# gt lt gte lte
res = Book.objects.filter(price__gt='29')  # <QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res)  # (0.016) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` > 29 LIMIT 21; args=(Decimal('29'),)

res = Book.objects.filter(price__lt='30')  # <QuerySet [<Book: 红楼梦>, <Book: 水浒传>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` < 30 LIMIT 21; args=(Decimal('30'),)

res = Book.objects.filter(price__gte='44.98')  # <QuerySet [<Book: 三国演义>, <Book: 西游记>, <Book: 封神榜>]>
print(res)  # (0.050) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` >= 44.98 LIMIT 21; args=(Decimal('44.98'),)

res = Book.objects.filter(price__lte='29.96')  # <QuerySet [<Book: 红楼梦>, <Book: 水浒传>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` <= 29.96 LIMIT 21; args=(Decimal('29.96'),)
5.3、range
# 范围 BETWEEN ... AND ...
res = Book.objects.filter(price__range=['20', '60'])  # <QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`price` BETWEEN 20 AND 60 LIMIT 21; args=(Decimal('20'), Decimal('60'))
5.4、contains
# 包含
res = Book.objects.filter(name__contains='楼')  # <QuerySet [<Book: 红楼梦>]>
print(res)  # (0.050) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY '%楼%' LIMIT 21; args=('%楼%',)
5.5、icontains
# 忽略大小写的包含
res = Book.objects.filter(name__icontains='abc')  # <QuerySet [<Book: Abc>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE '%abc%' LIMIT 21; args=('%abc%',)
5.6、startswith
# 以...开头, istartswith同理(忽略大小写)
res = Book.objects.filter(name__startswith='A')  # <QuerySet [<Book: Abc>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY 'A%' LIMIT 21; args=('A%',)
5.7、endswith
# 以...结尾, iendswith(忽略大小写)
res = Book.objects.filter(name__endswith='梦')  # <QuerySet [<Book: 红楼梦>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` LIKE BINARY '%梦' LIMIT 21; args=('%梦',)
5.8、时间类型
# year month day等
res = Book.objects.filter(publish_time__year='2019')  # <QuerySet [<Book: Abc>]>
print(res)  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`publish_time` BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 23:59:59.999999' LIMIT 21; args=('2019-01-01 00:00:00', '2019-12-31 23:59:59.999999')

6、单表操作

6.1、单表增加
# 两种方式
# 第一种:
models.Book.objects.create(name='三国演义',price=10.34,publish='北京出版社')

# 第二种:
book=models.Book(name='西游记',price=11.34,publish='上海出版社')
book.save()
6.2、单表查询
1、查询所有书籍
res = models.Book.objects.all()
print(res)

2、查询名字叫西游记的书(是个列表: QuerySet)
res = models.Book.objects.filter(name='西游记')
res = models.Book.objects.filter(name='西游记')[0]
res = models.Book.objects.filter(name='西游记').first()

查询名字叫西游记的书(就是book对象),如果没有或者有多个,都会报错
查询结果必须有且仅有一个才正常,否则报错
res = models.Book.objects.get(name='sss')  # 报错
6.3、单表删除
# 两种方式
# 方式一(QuerySet的delete方法)
res = Book.objects.filter(name='Abc').delete()  # (1, {'app01.Book': 1})
print(res)  # (0.059) DELETE FROM `Book` WHERE `Book`.`name` = 'Abc'; args=('Abc',)

# 方式二(对象自己的delete方法)
book = Book.objects.filter(name='封神榜').first()  # (0.000) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '封神榜' ORDER BY `Book`.`id` ASC LIMIT 1; args=('封神榜',)
book.delete()  # (0.064) DELETE FROM `Book` WHERE `Book`.`id` IN (5); args=(5,)
6.4、单表修改
# 两种方式
# 方式一(QuerySet的delete方法)
res = Book.objects.filter(name='红楼梦').update(price=39.96)  # 1
print(res)  # (0.058) UPDATE `Book` SET `price` = '39.96' WHERE `Book`.`name` = '红楼梦'; args=('39.96', '红楼梦')

# 方式二(对象自己的)
book = Book.objects.filter(name='红楼梦').last()
book.price = 88.35
book.save()  # (0.001) SELECT `Book`.`id`, `Book`.`name`, `Book`.`price`, `Book`.`publish_time`, `Book`.`publish` FROM `Book` WHERE `Book`.`name` = '红楼梦' ORDER BY `Book`.`id` DESC LIMIT 1; args=('红楼梦',)
             # (0.064) UPDATE `Book` SET `name` = '红楼梦', `price` = '88.35', `publish_time` = '2020-10-17 16:15:14', `publish` = '上海出版社' WHERE `Book`.`id` = 6; args=('红楼梦', '88.35', '2020-10-17 16:15:14', '上海出版社', 6)

7、python脚本中调用django环境

# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
    # 1、引入django配置文件(在manage.py中复制)
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xxx.settings')
    # 2、让djagno启动
    import django
    django.setup()
    # 3、编写代码
    pass

8、时区和国际化问题

setting.py中
1、后台管理汉语问题
	LANGUAGE_CODE = 'zh-hans'  # 管理后台看到的就是中文
2、时区问题(使用东八区)
	TIME_ZONE = 'Asia/Shanghai'
    USE_TZ = False

9、django admin(管理后台的简单使用)

1、管理后台是django提供的可以快速对表进行增删查改操作
2、创建一个后台管理账号
	python3 manage.py createsuperuser
    输入用户名
    输入邮箱(可以不填,直接回车)
    输入密码
    确认密码
    # 超级用户创建出来了,可以登录管理后台了
3、admin中表中一行一行的数据显示我们定制的样子
   可以重写模型类的__str__方法
4、需要把表注册到admin中
	在app下的admin.py中写
	from 对应的模块 import models
	admin.site.register(models.类名)
5、可以快速的对book表进行增删查改操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值