django框架——模型层 models.py

模型层 models.py

ORM 对象关系映射

类			表
对象		   记录	
对象属性	  记录某个字段对应的值

迁移命令

python3 manage.py makemigrations 将操作记录记录到migrations文件夹
python3 manage.py migrate  将操作真正的同步到数据库中

orm字段

id int primary_key auto_increment
一张表中必须要有一个主键字段 ;不定义 orm自动创建主键字段
AutoField(primary_key=True)

CharField 必须要指定max_length参数 

IntegerField
BigIntegerField		bigint

DecimalField
  max_digits=8
  decimal_places=2

EmailFiled				varchar(254)

DateField				
DateTimeField			
  auto_now:更新时间
  auto_now_add:创建时间
    
BooleanField(Field)	
字段传布尔值(False/True) 	数据库里面存0/1

TextField 没有字数限制

FileField		
  upload_to = "/data"
  将文件保存到/data目录下,将文件路径保存到数据库中


参数:
verbose_name 字段的解释
help_text='这里填书名'
on_delete=models.DO_NOTHING
db_constraint=False  逻辑上的关联,实质上没有外键连接,增删不会受外键影响,但是orm查询不影响

参考博客:https://www.cnblogs.com/Dominic-Ji/p/9203990.html

ForeignKey(unique=True)   ===		OneToOneField()

db_index
db_index=True 字段设置索引

to_field
	设置要关联的表的字段  默认不写关联的就是另外一张的主键字段

on_delete
django2.X及以上版本 需要指定外键字段的级联更新级联删除

表断关联
表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段)
断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(不影响增删改查操作)
断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,代码控制
级联关系
      models.CASCADE
      models.DO_NOTHING
      models.SET_NULL       
      models.SET_DEFAULT

自定义字段

class MyCharField(models.Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length
        # 调用父类的init方法
        super().__init__(max_length=max_length,*args,**kwargs)
        # 一定要是关键字的形式传入

    def db_type(self, connection):
        """
        返回真正的数据类型及各种约束条件
        """
        return 'char(%s)'%self.max_length

抽象表——公共字段

from django.contrib.auth.models import AbstractUser
class Meta:
    abstract=True  # 抽象表,不再数据库建立出表
class Meta:
    verbose_name_plural='书表'  # admin中表名的显示
def __str__(self):  # 网页上显示的对象名称
    return self.name

choices参数(数据库字段设计常见)

字段类型 与 123 类型一致
    gender_choices = (
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)
    
    
get_字段名_display()

    user_obj = models.User.objects.filter(pk=1).first()
    print(user_obj.get_gender_display())

字段的增删改查

# 字段的增加
  1.可以在终端内直接给出默认值
  2.该字段可以为空
     null=True
  3.直接给字段设置默认值
     default='study'

修改,删除后执行迁移命令即可
注意:字段没了,数据都删除了!!!

数据的增删改查

# 查
res = models.User.objects.filter(username=username)

不支持负数索引
user_obj = models.User.objects.filter(username=username).first()

# 查询出用户表里面所有的数据
    data = models.User.objects.filter()
    user_queryset = models.User.objects.all()


# 增
res = models.User.objects.create(username=username,password=password)

user_obj = models.User(username=username,password=password)
user_obj.save()

# 改

models.User.objects.filter(id=edit_id).update(username=username,password=password)
批量更新操作,只修改被修改的字段

edit_obj.username = username
edit_obj.password= password
edit_obj.save()
所有字段全部更新 无论该字段是否被修改

        
# 删 给数据添加 is_delete 字段,表示是否删除
models.User.objects.filter(id=delete_id).delete()
# obj 必须将filter.first() 赋值给 obj 然后对obj进行操作,如下不行。
# 每次取出的都是之前的对象,没变。最后一条,取出来再 save。。。
        obj = models.Book.objects.filter(id=id).first()
        models.Book.objects.filter(id=id).first().book_name=book_name
        models.Book.objects.filter(id=id).first().price=price
        models.Book.objects.filter(id=id).first().save()

django orm中如何创建表关系

在django1.X版本中外键默认级联更新删除
外键字段建在多的一方,查询频率高的一方

一对多
	models.ForeignKey(to='关联表名')
	models.ForeignKey(to=关联表名)  关联表名必须出现在上方
    自动加id
		
一对一
	models.OneToOneField(to='关联表名')
    自动加id
		
多对多
	models.ManyToManyField(to='关联表名')

多对多三种创建方式

# 全自动:orm自动创建第三张关系表
	优点:非常的方便 支持orm提供操作第三张关系表的方法
	不足之处:没有办法额外添加字段

# 纯手动
	class Book(models.Model):
    name = models.CharField(max_length=32)
    
	class Author(models.Model):
    name = models.CharField(max_length=32)
  
  class Book2Author(models.Model):
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')

  优点:第三张表能添加字段
  不足之处:不能够再使用orm提供的简单的方法
  不建议用该方式


# 半自动
class Book(models.Model):
    name = models.CharField(max_length=32)
    authors = models.ManyToManyField(to='Author',
                                     through='Book2Author',
                                     through_fields=('book','author')
                                     )
class Author(models.Model):
    name = models.CharField(max_length=32)
    
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')


through_fields字段先后顺序:主动表,被动表 
半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法

一般都会采用半自动
posted @   pythoner_wl  阅读(215)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示