Python_Django

Django 七

2021-08-12  本文已影响0人  吃可爱长大鸭

目录

1.orm常用和非常用字段
2.orm字段参数
3.orm字段关系
4.手动创建第三张表(了解)
5.Meta元信息
6.原生sql

1.orm常用和非常用字段

1.常用
AutoField  IntegerField  CharField DateField DateTimeField

2.不常用的
BooleanField  TextField  FileField

2. orm字段参数

1 null 是否可以为空
2 unique 是否唯一
3 db_index 是否给该字段建索引
4 default  默认值为
5 DateField和DateTimeField 两个参数
    #### auto_now_add
    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
    #### auto_now(对象.属性  对象.save())   queryset.update无效
    配置上auto_now=True,每次更新数据记录的时候会更新该字段。
6 choices(知道)
    -在model表模型定义的时候给某个字段指定choice
    sex_choice=((1,'男'),(2,'女'),(0,'未知'))
    sex =models.IntegerField(default=1,choices=sex_choice)
    -在使用的时候,直接取出中文
        对象.get_sex_display()
7 了解的
    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作

3.orm字段关系

1 一对以  一对多  多对多
2 ForeignKey
    -to :对那张表
    -to_field:对表中的某个字段
    -related_name:反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’
    -related_query_name:反向查询操作时,使用的连接前缀,用于替换表名
    -on_delete:
        当删除关联表中的数据时,当前表与其关联的行的行为。
          models.CASCADE
          删除关联数据,与之关联也删除
          models.DO_NOTHING
          删除关联数据,什么都不做
          models.PROTECT
          删除关联数据,引发错误ProtectedError
          models.SET_NULL
          删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
          models.SET_DEFAULT
          删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
          models.SET
          删除关联数据,
          a. 与之关联的值设置为指定值,设置:models.SET(值)
          b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
        -db_constraint
            -True:建立外键,默认是True
            -False:不建立外键
            -外键是否建立:
                -好处:不会出现脏数据
                -坏处:插入的时候,效率低
                -企业中:通常不建立,程序员控制
                
3 OneToOneField-跟ForeignKey
4 ManyToManyField:如何手动创建第三张表

4.手动创建第三张表(了解)

-字段参数
    -db_table:指定第三张表的名字
    -to:关联的表
    -related_name       同ForeignKey字段。
    -related_query_name  同ForeignKey字段。
    
    -through:手动创建第三张表,指定通过哪个表
    -through_fields:关联字段是什么
    
-多对多关系建立的三种方式
    -第一种:自动创建(常用:第三张表没有其他字段)
    -第二种:手动创建第三张表(比较常用:第三张表有多余字段)
    -第三中:完全手动写第三张表

第一种

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")

第二种

class Book1(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")

# 自己创建第三张表,并通过ManyToManyField指定关联
class Author1(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book1", through="Author2Book", through_fields=("author", "book"))
    # through_fields 元组的第一个值是ManyToManyField所在的表去中间表通过那个字段,就写在第一个位置

class Author2Book(models.Model):
    author = models.ForeignKey(to="Author1")
    book = models.ForeignKey(to="Book1")

##基于对象的跨表查,还能继续使用
## 基于双下划綫连表查
## 原来的多对多操作api用不了了,需要手动操作

第三种

class Book1(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")
    

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


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

5.Meta元信息

# 在每一个模型类中都可以写
class Meta: #元信息
    db_table='lqz_publish'  #表名
    index_together=('name','city')  # 多个字段联合索引
    unique_together=('name','city') # 联合唯一
    ordering=('nid', ) # 默认以哪个字段排序

6.原生sql

 from app01 import models
    res=models.Author.objects.all()
    for author in res:
         print(author.sex)
         print(author.get_sex_display())

    # 使用原生sql
    res=models.Author.objects.raw('select * from app01_author where nid>1')
    for author in res:
        print(author.name)

    res = models.Author.objects.raw('select * from app01_book where nid>1')
    for book in res:
        print(book.price)
        
 # 执行原生sql,跟对象类型无关了,查出什么字段,可以直接使用该字段
上一篇 下一篇

猜你喜欢

热点阅读