Django学习--模型层

这篇博客探讨了Django框架中的模型层,包括如何定义模型类、普通字段类型及参数、基本查询操作如all(), filter(), exclude()。此外,文章介绍了数据的保存与删除方法,以及一对一、一对多和多对多关系的实现。最后,讨论了面向对象的ORM特性,如抽象类继承、多表继承和代理模型继承,并强调了数据库设计在项目中的重要性。" 51593042,5663330,使用二分查找解决和为给定数的问题,"['算法', '编程', '二分搜索']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学到模型层的更详细的部分了,分享的同时也是自己的积累

我们在某个project的某个app的models.py文件中进行进一步的操作:

我们现在可以对模型类进行如下定义:

from django.db import models

class ModelsName(models.Model):
    field1=models.XXField(...)
    field2=models.XXField(...)
    ..
    class Meta:
        db_table=...
        other_metas=...



"""
    上面只是一种模型类定义的模板,具体可以自己去实现,这里讲一下Meta类的作用
    有看过Python高级的同学肯定知道Meta类就是python中的元类,简单来说就是生成其他类的类,元类的基类是type,这里就不展开讨论了
    然后我们来看Meta类还有什么元数据:
    abstract:True或False,标识本模型类是否为抽象基类,抽象基类在django中一般用于管理其他模型类
    app_label:定义本模型类所属的应用
    db_table:映射的数据表名,这应该比较好了解,毕竟模型类的构建就是为了更加方便,直观的去操作数据库中数据表
    managed:True或False,定义manage.py是否管理本模型
    ordering:本模型记录的默认排序字段
    default_permissions:模型的操作权限,默认有三种'add','change','delete'
    require_db_vendor:定义底层数据库的类型,比如SQLite,MySQL,Oracle等
    unique_together:用来设置不重复的字段组合,必须唯一,相当于主键
    index_together:定义联合索引的字段,可以设置多个,索引是用来提高查询效率的

    
    以上说的都是元数据字段,就是有关于数据库怎么创建的,创建成什么样的
    ...
    
"""

然后就是普通字段了:

普通字段就是数据表中的各个字段,有:AutoField,CharField,TextField等等很多

普通字段还用参数:primary_key,max_length,choices(就是字段的值域)

 

 

 

基本查询语句:

在命令行下,模型类名.objects.all()

模型类名.objects.filter(条件),过滤器

模型类名.objects.exclude(条件),排除

数据保存与删除:

创建模型类实例后调用save()方法就可以了

删除就调用delete()方法

 

关系操作:

一对一关系:

class Account(models.Model):
    user_name=models.CharField(max_length=90)
    passwd=models.CharField(max_length=255)
    date=models.DateField()
    
    def __str__(self):
        return str(self.user_name)

class People(models.Model):
    account=models.OneToOneField(
        Account,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    code=models.CharField(max_length=80)
    address=models.CharField(max_length=100)
    
    def __str__(self):
        return str(self.account.user_name)+' '+str(self.address)

'''
    ondelete的字段属性注意一下,意思就是,当一个删除了,另一个要不要跟着删除,这里是会跟着删除
    大家想一下,上面两个模型类在数据库中会生成什么样的数据表呢,是不是会生成
    一个人对应一个账户呢,这与实际的生活也是比较符合的,除非一些特殊情况,所以
    数据库的设计也是非常重要的,这需要考虑全面而且要有一定的远瞻
    一个好的web基础就是数据库设计一定要做的好,这才能保证程序的长久,而且扩展性也要额外考虑
'''

一对多关系:

类似的一对多就在相应的字段属性里面ForeignKey,这个大家应该都没有问题,因为一对多的关系就是用外键来进行联系的

具体怎么用呢:

在上面的account字段中account=models.ForeignKey(Account),这样,一个Account就可以关联过个人了,这明显就不太符合生活实际,但这只是举例子

多对多关系:

models.ManyToMany(Account)就可以了,多对多关系会生成一张额外的关系表,关系表的主键是连接的两个表的外键

 

面向对象ORM:

抽象类继承:父类继承自models.Model,但不会在数据库中生成相应的数据表,子类继承自这个父类,子类会创建数据表

父类的Meta的元数据的abstract要设置为True,就有点像c++中抽象类,专门用于给人继承,但是不生成实例,而是让子类

去创建实例

多表继承:

多表继承的每个模型类都在数据库生成相应的数据表,就是父类和子类都会创建数据表,但是子类字段只会创建子类自己的

属性和父类的主键属性

代理模型继承:

代理模型中子类只用于管理父类的数据,所以我们只需在子类的Meta类的元数据里面的proxy=True就行了

那为什么要用代理模型继承呢,因为子类中新的特性不会影响父类模型及其已有代码的行为

 

总结一下,个人觉得模型层的关键还是数据库的设计,这也是一个项目经理要具备的基本技能,一个好的程序要建立在好的数据库上,还有就是数据查询的优化了,这个我也不是很懂,就不误导大家了

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值