python-django模型层_单表操作_常用字段和参数概览_打印原生sql_查询表记录API_模糊查询_python脚本调用django

13 篇文章 0 订阅

django 模型层

单表操作

1. 字段和字段参数介绍

1. 示例
# 示例
class Book(models.Model):
    # 如果不写id,会默认生成一个id,并且自增
    # primary_key=True 表示该字段是主键,一个表中只能有一个主键
    # id = models.AutoField(primary_key=True)
    # varchar类型,长度: max_length
    # 字段是否可以为空: null=True,可以为空
    # 默认值:default='未知书名',如果没传值,默认是它
    # 设置索引: db_index=True 表示该字段是辅助索引
    # 是否唯一: unique=True 表示唯一
name=models.CharField(max_length=32,null=True,default='未知书名',db_index=True,unique=True)
    
    # float类型
    # max_digits=5 => 最大长度是5   例: 4567.5
    # decimal_places=2 小数点后两位  例: 23.56  999.99
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # DateTimeField 年月日时分秒
    # auto_now=True     新增,每次更新数据记录的时候会更新该字段
    # auto_now_add=True 修改,创建数据记录的时候会把当前时间添加到数据
    publish_date=models.DateTimeField(auto_now=True)

    publish=models.CharField(max_length=32)
2. 单表常见字段及属性
-常见字段
    -AutoField:     自增 必须填入参数 primary_key=True 没有自增列会自动创建一个名为id的列
    -CharField:    varchar类型 必须提供max_length参数 => 表示字符长度
    -DecimalField: 带小数点数字
    -DateTimeField: 年月日时分秒
    -DateField:     年月日
    -IntegerField   整数
    -BooleanField   布尔
    -FileField      上传文件,本质是varchar
    -ImageField     图片,本质是varchar,继承了FileField
    -TextField      存大文本
    -EmailField     本质是varchar
        
-常见字段属性
    -primary_key      主键
    -max_length       最大长度的
    -max_digits=5     数字最大长度
    -decimal_places=2 小数点后几位
    -auto_now:        配置上auto_now=True,每次更新数据记录的时候会更新该字段
    -auto_now_add:    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
            
    -公司项目常见字段
        -create_time   
        -update_time

    -公共
        -null         是否可以为空
        -default      默认值是
        -db_index     是否建索引
        -unique       是否是唯一
        -blank        django admin里提交数据,限制
        -choices
3. 非常用字段
# 非常用字段	
    -BigAutoField
    -SmallIntegerField   
    -PositiveSmallIntegerField
    -PositiveIntegerField
    -BigIntegerField
    
# ORM字段与数据库实际字段的对应关系    
	'AutoField': 'integer AUTO_INCREMENT',
    'BigAutoField': 'bigint AUTO_INCREMENT',
    'BinaryField': 'longblob',
    'BooleanField': 'bool',
    'CharField': 'varchar(%(max_length)s)',
    'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
    'DateField': 'date',
    'DateTimeField': 'datetime',
    'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
    'DurationField': 'bigint',
    'FileField': 'varchar(%(max_length)s)',
    'FilePathField': 'varchar(%(max_length)s)',
    'FloatField': 'double precision',
    'IntegerField': 'integer',
    'BigIntegerField': 'bigint',
    'IPAddressField': 'char(15)',
    'GenericIPAddressField': 'char(39)',
    'NullBooleanField': 'bool',
    'OneToOneField': 'integer',
    'PositiveIntegerField': 'integer UNSIGNED',
    'PositiveSmallIntegerField': 'smallint UNSIGNED',
    'SlugField': 'varchar(%(max_length)s)',
    'SmallIntegerField': 'smallint',
    'TextField': 'longtext',
    'TimeField': 'time',
    'UUIDField': 'char(32)',    
4. 常用和非常用字段合集
AutoField(Field)
    - int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
    - bigint自增列,必须填入参数 primary_key=True

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)
    - 二进制类型
5. ORM字段参数
1. 常见字段参数
null
	用于表示某个字段可以为空

unique
	unique=True 则该字段在此表中必须是唯一的

db_index
	db_index=True 则代表着为此字段设置索引

default
	为该字段设置默认值

DateField和DateTimeField
    auto_now_add
    	auto_now_add=True  创建数据记录的时候会把当前时间添加到数据库
    auto_now
    	auto_now=True      每次更新数据记录的时候会更新该字段
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中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
	例:gf = 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'), ]
        )
6. 关系字段
1. ForeignKey
ForeignKey
	外键类型在ORM中用来表示外键关联关系 一般把ForeignKey字段设置在 '一对多''多'的一方
	ForeignKey可以和其他表做关联关系 同时也可以和自身做关联关系
    
to
	设置要关联的表

to_field
	设置要关联的表的字段

related_name
	反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
    # 示例1
        class Classes(models.Model):
            name = models.CharField(max_length=32)

        class Student(models.Model):
            name = models.CharField(max_length=32)
            theclass = models.ForeignKey(to="Classes") 
            
        # 当要查询某个班级关联的所有学生(反向查询)时
            models.Classes.objects.first().student_set.all()
            
    # 示例2    
        # 当在ForeignKey字段中添加了参数 related_name 后
            class Student(models.Model):
                name = models.CharField(max_length=32)
                theclass = models.ForeignKey(to="Classes", related_name="students")

        # 当要查询某个班级关联的所有学生(反向查询)时
            models.Classes.objects.first().students.all()  
            
related_query_name
	反向查询操作时,使用的连接前缀,用于替换表名

on_delete
  当删除关联表中的数据时,当前表与其关联的行的行为

  models.CASCADE
		删除关联数据,与之关联也删除

  models.DO_NOTHING
		删除关联数据,引发错误IntegrityError

  models.PROTECT
		删除关联数据,引发错误ProtectedError

  models.SET_NULL
		删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

  models.SET_DEFAULT
		删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

  models.SET
        删除关联数据
            1. 与之关联的值设置为指定值,设置:models.SET()
            2. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)    
            
    # 示例
    def func():
    	return 10

    class MyModel(models.Model):
        user = models.ForeignKey(
            to="User",
            to_field="id",
            on_delete=models.SET(func)
        )

db_constraint
	是否在数据库中创建外键约束,默认为True       
2. OneToOneField
OneToOneField (一对一字段)
	通常一对一字段用来扩展已有字段

	一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下
    将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系
    
to
	设置要关联的表

to_field
	设置要关联的字段

on_delete
	同ForeignKey字段
    
# 示例
class Author(models.Model):
    name = models.CharField(max_length=32)
    info = models.OneToOneField(to='AuthorInfo')
    
class AuthorInfo(models.Model):
    phone = models.CharField(max_length=11)
    email = models.EmailField()
3. ManyToManyField
ManyToManyField
	用于表示多对多的关联关系 
    在数据库中通过第三张表来建立关联关系

to
	设置要关联的表

related_name
	同ForeignKey字段

related_query_name
	同ForeignKey字段

symmetrical
	仅用于多对多自关联时,指定内部是否创建反向操作的字段 默认为True
    
    # 示例
    class Person(models.Model):
        name = models.CharField(max_length=16)
        # person对象没有person_set属性
        friends = models.ManyToManyField("self")

    class Person(models.Model):
        name = models.CharField(max_length=16)
        # person对象可以使用person_set属性进行反向查询
        friends = models.ManyToManyField("self", symmetrical=False)    
    
through
	在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系
	但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名

through_fields
	设置关联的字段

db_table
	默认创建第三张表时,数据库中表的名称    
7. 多对多关联关系的三种方式
1. 方式一:自行创建第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")

class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")

# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")

    class Meta:
        unique_together = ("author", "book")
2. 方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")

# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", related_name="authors")
3. 方式三:设置ManyTomanyField并指定自行创建的第三张表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")

# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    # through_fields接受一个2元组('field1','field2'):
    # 其中field1是定义ManyToManyField的模型外键的名(author)
    # field2是关联目标模型(book)的外键名

class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")

    class Meta:
        unique_together = ("author", "book")
4. 总结
	当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式
	但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系
8. 元信息
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

db_table
	ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名

index_together
	联合索引

unique_together
	联合唯一索引

ordering
	指定默认按什么字段排序
	只有设置了该属性,我们查询到的结果才可以被reverse()
    
# 示例
 class UserInfo(models.Model):
        nid = models.AutoField(primary_key=True)
        username = models.CharField(max_length=32)

        class Meta:
            # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
            db_table = "table_name"

            # 联合索引
            index_together = [
                ("pub_date", "deadline"),
            ]

            # 联合唯一索引
            unique_together = (("driver", "restaurant"),)
            
            ordering = ('name',)
            
            # admin中显示的表名称
            verbose_name='图书表'
            # verbose_name加s
            verbose_name_plural='图书表'
9. 自定义字段
# 自定义char类型字段
class FixedCharField(models.Field):
    """
    自定义的char类型的字段类
    """
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        """
        限定生成数据库表的字段类型为char,长度为max_length指定的值
        """
        return 'char(%s)' % self.max_length

class Class(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=25)
    # 使用自定义的char类型的字段
    cname = FixedCharField(max_length=25)

2. 单表增加

# 单表增加记录的两种方式

# 方式一
	models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')

# 方式二
	book=models.Book(name='yyy',price=11.34,publish='南京出版社')
    book.save()

3. 单表查询

# 示例: 查询名字叫xxx的书
from app01 import models

def books(request):
    # 增加记录方式一
    models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')
    
    # 增加记录方式二
    book=models.Book(name='yyy',price=11.34,publish='南京出版社')
    book.save()

    # 查询所有记录
    res=models.Book.objects.all()
    print(res)
    
    # 查询方式一: 查询名字叫xxx的书(返回queryset对象: 列表)
    res = models.Book.objects.filter(name='xxx')
    res = models.Book.objects.filter(name='xxx')[0]      # 取第一个
    res = models.Book.objects.filter(name='xxx').first() # 取第一个

    # 查询方式二: 查询名字叫xxx的书(就是book对象),如果没有或者存在多个,都报错
    # 查询结果必须有且仅有一个才正常,不符合这个条件都抛异常
    res=models.Book.objects.get(name='sss')

    print(res.name)
    return HttpResponse('两本书保存成功')

4. 单表删除

# 删除的两种方式
    # 第一种:queryset的delete方法
        res=models.Book.objects.all().delete()
        print(res)
    
    # 第二种:对象自己的delete方法
        book = models.Book.objects.all().filter(name='金瓶梅').first()
        print(type(book))
        res=book.delete()

5. 单表修改

# 修改记录
    # 第一种: queryset的update方法
        res=models.Book.objects.filter(publish='东京').update(name='金瓶梅1')
        print(res)
        
    # 第二种: 对象自己的
        book = models.Book.objects.filter(name='xxx').last()
        book.name='asdfasd'
        book.save()

6. Django终端打印原生sql

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

7. 查询表记录API

1. API介绍
<1> all():                  
    查询所有结果
<2> filter(**kwargs):       
    它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs):          
    返回与所给筛选条件相匹配的对象,返回结果有且只有一个,若符合筛选条件的对象超过一个或没有都会抛出错误。
<4> exclude(**kwargs):      
    它包含了与所给筛选条件不匹配的对象
<5> order_by(*field):       
    对查询结果排序('-id')
<6> reverse():              
    对查询结果反向排序
<8> count():                
    返回数据库中匹配查询(QuerySet)的对象数量。
<9> first():                
    返回第一条记录
<10> last():                
    返回最后一条记录
<11> exists():              
    如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field):        
    返回一个ValueQuerySet => 一个特殊的QuerySet
    运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   
    与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct():            
    从返回结果中剔除重复纪录
2. 单表API操作
1. all 
	# 查询所有,返回queryset对象,目前先当成列表(像列表)
    res=models.Book.objects.all()
    print(res)
    print(type(res))

2. filter 
	# 过滤queryset对象的方法
    res=models.Book.objects.filter(name='金瓶梅')
    print(res)
    res=models.Book.objects.all().filter(name='金瓶梅')
    print(res)
    res = models.Book.objects.all().filter(name='金瓶梅',publish='东京出版社')
    print(res)
    print(type(models.Book.objects))

3. get 
	# get queryset对象的方法
    res = models.Book.objects.all().get(name='金瓶梅')
    res = models.Book.objects.get(name='金瓶梅')
    res = models.Book.objects.filter().get(name='金瓶梅')

4. exclude  
	# 排除,返回queryset对象,可以继续链式调用
    # 查询名字不是金瓶梅的数据
    res=models.Book.objects.exclude(name='金瓶梅')
    print(res)

5. order_by  
	# 排序(先后,由顺序)  加-表示降序
    res=models.Book.objects.all().order_by('id')
    res=models.Book.objects.all().order_by('-id')
    res=models.Book.objects.all().order_by('name','-id',)
    res=models.Book.objects.all().order_by('-id','name')
    print(res)

6. reverse 
	# 反向 ,必须结合order_by使用,对结果进行反转
	# 等同于 ('-i')
    res = models.Book.objects.exclude(name='金瓶梅').order_by('-id')
    res = models.Book.objects.exclude(name='金瓶梅').order_by('id').reverse()
    print(res)

7. count  
	# 统计条数
    res=models.Book.objects.exclude(name='金瓶梅').count()
    res=models.Book.objects.all().count()
    print(res)

8. first  
	# 返回第一条记录 返回结果不再是queryset对象
    res = models.Book.objects.exclude(name='金瓶梅').first()
    print(res)
    
9. last  
	# 返回最后一条记录 返回结果不再是queryset对象
    res = models.Book.objects.exclude(name='金瓶梅').last()
    print(res)

10. exists() 
	# 判断结果有没有值 返回结果不再是queryset对象
    res = models.Book.objects.exclude(name='金瓶梅').exists()
    print(res)
    res = models.Book.objects.filter(name='金瓶梅dasf').exists()
    print(res)

11. values 
	# 指定只查某几个字段
    res = models.Book.objects.all().values('name','publish')
    res = models.Book.objects.all().values('name','publish').first()
    print(type(res))

12. values_list
    res = models.Book.objects.all().values_list('name','publish').first()
    print(res)
    print(type(res))

13. distinct 
	# 对结果进行去重
    res = models.Book.objects.all().values('name','publish').distinct()
    res = models.Book.objects.all().values('name').distinct()
    print(res)

8. 基于双下划线的模糊查询

# 1. 价格在[100,200,300]这个范围内
	Book.objects.filter(price__in=[100,200,300])
    
# 2. 大于,小于,大于等于,小于等于
    Book.objects.filter(price__gt=100)
    Book.objects.filter(price__lt=100)
    Book.objects.filter(price__gte=100)
    Book.objects.filter(price__lte=100)
    
# 3. 范围
	Book.objects.filter(price__range=[100,200])

# 4. 包含
	Book.objects.filter(title__contains="python")

# 5. 忽略大小写包含
	Book.objects.filter(title__icontains="python")

# 6. 以xx开头
	Book.objects.filter(title__startswith="py")

# 7. 时间类型,年份是2012年的
	Book.objects.filter(pub_date__year=2012)
    
# 示例
1. in 条件
    res=models.Book.objects.filter(name__in=['西游记', '金瓶梅'])
    print(res)
    
2. 大于,小于,大于等于,小于等于
    res=models.Book.objects.filter(id__gt=2)
    res=models.Book.objects.filter(id__lt=2)
    res=models.Book.objects.filter(id__gte=2)
    res=models.Book.objects.filter(id__lte=2)
    print(res)

3. range 范围 BETWEEN 1 AND 3
    res=models.Book.objects.filter(id__range=[1,3])
    print(res)

4. contains 包含
    res=models.Book.objects.filter(name__contains="金")
    print(res)
    
5. icontains 忽略大小写的包含 
    res=models.Book.objects.filter(name__icontains="金")
    print(res)

6. 以xx开头/结尾   
    res=models.Book.objects.filter(name__startswith="金")
    print(res)
    res = models.Book.objects.filter(name__endswith='梅')
    print(res)

7.  时间类型  
    res=models.Book.objects.filter(publish_date__year='2020')
    res=models.Book.objects.filter(publish_date__month='9')
    print(res)

9. python脚本中调用django环境

# 在脚本中调用djagno服务
import os
if __name__ == '__main__':
    # 1. 引入django配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
    
    # 2. 让djagno启动
    import django
    django.setup()
    
    # 3. 使用表模型
    from app01 import models
    models.Book.objects.create(name='测试书籍',publish='xx出版社')

10. 拓展

1. 时区和国际化问题
# settings.py配置文件
1. 后台管理汉语问题
	# 默认是英文'en-us'
    LANGUAGE_CODE = 'en-us'
	# 管理后台看到的就是中文
	LANGUAGE_CODE = 'zh-hans'  
    
2. 时区问题
	# 默认时区
    TIME_ZONE = 'UTC'
	USE_I18N = True
	USE_L10N = True
	USE_TZ = True
	# 使用东八区
	TIME_ZONE = 'Asia/Shanghai'
    USE_I18N = True
	USE_L10N = True
    USE_TZ = False
2. django admin(管理后台的简单使用)
# 管理后台是django提供的可以快速对表进行增删查改操作

# 使用方法
1. 创建一个后台管理账号
    python3 manage.py createsuperuser
    输入用户名
    输入邮箱(可以不填,敲回车)
    输入密码
    确认密码
    # 超级用户创建出来了,可以登录管理后台了
    
2. admin中表中一行一行的数据显示我们定制的样子
	重写模型类的__str__方法
    
    # 示例
    class Book(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=32)
        # 时区相关
        # 默认存当前时间,默认存utc时间
        # 咱们是东八区,存到数据库中时间差8个小时
        # 通过设置,让存的时候,就存东八区时间,在配置文件中
        publish_date=models.DateTimeField(auto_now_add=True)
        # blank=True 在admin中新增数据,可以为空
        # 修改跟数据库有关才需要做迁移
        publish=models.CharField(max_length=32,null=True,blank=True)
        class Meta:
           ...
        def __str__(self):
            return self.name
3. blank参数作用
1. 需要把book表注册到admin中
	在app下的admin.py中写
    from app01 import models
	# 把book表注册一些,管理后台就能看到了
	admin.site.register(models.Book)
    
2. 可以快速的对book表进行增删查改操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I believe I can fly~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值