Django入门二之 (ORM)

ORM(Object Relation Mapping) 对象关系映射

Django对数据库进行了一层抽象,把数据库抽象成了一些模型
数据库配置:
    setting.py
    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'NAME': 'cms_zabbix', #数据库名称
        'USER': 'root', # 链接数据库的用户名
        'PASSWORD': 'yuyang729', # 链接数据库的密码
        'HOST': 'localhost', # mysql服务器的域名和ip地址
        'PORT': '3306', # mysql的一个端口号,默认是3306
    }
}

使用模型条件:
    1: 所有定义数据库操作均在每一个app下的models.py
    2: 模型如果需要映射到数据库,所在的app必须被**安装**
    3: 一个数据表对应的一个模型,表中的字段,对应模型中的类属性
    4: 任何模型都要继承models.Model
    
映射两部曲(创建完数据模型 必须要执行一下两步骤):
    python3.6 manage.py makemigrations //创建一个映射文件 可以指定app进行映射
    python3.6 manage.py migrate //将映射文件中映射数据真正提交到数据中
    
    
语法:
    id自增长问题 默认Django会给我们自己创建所以我们无需创建自增长id
    models.IntegerField(primary_key=True) //定义主键 int类型
    models.AutoField() //自增长 
    models.CharField(max_length=100,null=False) //字符串类型 最大长度为100 默认为空
    models.TextField() //相当于SQL的Varchar 长度较大
    
    class ArticleModel(models.Model):
        title = models.CharField(max_length=100,null=True)
        content = models.TextField(max_length=100,null=True)
      
        class Meta:
            db_table = 'new_table_name' //更改表名
增:
    blogModel = BlogModel(id=1,title='第一篇博客',content='hello world')
    blogModel.save():
    delete = BlogModel.objects.all()[0]; 
    delete.delete() //删除只需要一条命令,删除第一个内容的数据
    
改: 
    update = BlogModel.objects.all()[0]
    update.title = new_value 
    update.save():
    查找的行为和条件全部在objects下写
    objects.all()//取出所有的数据
    objects.get(id=1) //查到id1的数据
    BlogModel.objects.all().first() //取出数据的第一条数据
    select = BlogModel.objects.all()[0]  第一条可以取下标[0]
    select.title //第一条数据的title内容
    

Django ORM相关字段

int               IntegerField 
smallint          SmallInterfield 
int unsigned      PositiveInterField 
bigint            BigInterField 
Char              CharField 
Text              TextField 
Float             FloatField 
datetime          DateTimeField 
boolean           BooleanField 
可以空的boolean   NullBooleanField 
邮箱              EmailField 
文件路径          FilePathField 
URL字段           URLField
UUID字段          UUIDField

在使用以上这些Field的时候,可以指定一些常用的参数:
    null: 默认为False,如果指定为True表示该字段可以为空,一般在Char和Text中不应该使用Null,而应该使用blank,null是纯粹是数据库的语法
    blank: 默认为False,如果指定为True,则在form表单验证的时候,可以为空。blank是django给表单验证的时候添加的
    default: 提供一个默认值
    editable: 是否可以编辑 id=UUIDField(editable=False)
    DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用Model.save()方法才会调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及Time类才有的
    DateField.auto_now_add:第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值

#外键:
    ForeignKey(othermodel,on_delete) othermodel  最好是字符串类型! 
        ondelete可以写一下参数:
        CASCADE:级联删除,如果删除,相关联的那个也会删除
       PROTECT:保护类型。如果删除,将会抛出一个ProtectedError错误
       SET_NULL:如果删除了本条数据,外键的那条数据将会设置为null,这个只有在外键null为True的情况下才可以使用
       SET_DEFAULT:如果删除了本条数据,外键那条数据将会职位默认值,这个只有在外键那个字段设置了default参数才可以使用
       ManyToManyField:多对多。语法是ManyToManyField(othermodel)
othermodel表示的是其他模型,如果othermodel这个模型在本模型之后定义的,则必须使用字符串(’othermodel’)

#外键示例:
    class ArticleModel(models.Model):
        title = models.CharField(max_length=100,null=True)
        author = models.ForeignKey('AuthorModel',null=True,on_delete=models.CASCADE) 
        
    class AuthorModel(models.Model):
        name = models.CharField(max_length=20,default="yuyang")
    
    blog = ArticelModel(title=123)
    blog.author = AuthorModel.objects.get(id=1)
    blog.save()
    
#多对多
    多对多取所有 article.tags.all()
    class ArticleModel(models.Model):
        title = models.CharField(max_length=100,null=True)
        content = models.TextField(max_length=100,null=True)
        tag = models.ManyToManyField('TagModel',null=True)
        
    class TagModel(models.Model):
        name = models.CharField(max_length=10,null=True)
    
    tag =  TagModel('Django')
    tag.save()
    1:创建一个blogmodel
        blog = ArticelModel(title=123)
    2:创建好的blogmodel保存在数据库中
        blog.save()
    3:把需要添加的tag添加到blogmodel中
        tags =  TagModel.objects.all()
        for tag in tags:
            blog.tag.add(tag) //或者直接 blog.tag.set(tags) 
                              //set会把参数中的数据和之前的全部覆盖掉!
    
#检索对象:objects
    a = objects.all().annotate(Count('model')) //聚合函数统计model的数量
    a[0].Count 
    all()方法:返回该对象的所有数据,也是一个QuerySet对象
    filter(**kwargs)方法:根据参数提供的提取条件,获取一个过滤后的QuerySet。
    exclude(**kwargs)方法:根据参数提供的条件,排除符号条件的数据,返回一个QuerySet对象。
    get(**kwargs)方法:只会返回一个对象,如果所有条件都不满足或者是满足条件的有多个,将抛出一个异常
    order_by(*args):根据给定的参数进行排序,生序为 -
    values()方法:将返回来的QuerySet中的Model转换为字典
    count()方法:将返回当前查询到的数据的总数,这个比length方法更有效
    latest(field_name=None)方法:根据提供的参数field_name来进行排序,field_name这个参数必须是时间字段,然后提取离现在最近的一条数据
    earliest()方法:用法和latest一样,只是这个是获取最久远的一个
    first()方法:获取查询到的数据的第一条数据。如果用了order_by,那么将获取排序后的第一条。如果没有用order_by,那么将根据id进行默认排序。
    
    last()方法:用法和first一样,只不过是获取的是最后一条的数据。
    
    update(**kwargs):更新数据方法。这个方法可以对查询出来的QuerySet里面的所有元素进行更新,并且更新参数的个数也是不限的。另外要注意的是,因为get方法返回的不是QuerySet对象,因此使用get方法提取出来的数据不能使用update方法。出于这种情况,建议应该使用filter(pk=xx)来替代get(pk=xxx)方法。并且,使用get出来的模型,修改数据后再save,会更新所有的数据,比update的效率更低
    delete()方法:删除QuerySet中的模型。
    
#name__  name 代表字段名后面可以跟一下条件 字段名+两个下划线+等号+具体条件
    exact:相当于等于号
    iexact:跟exact,只是忽略大小写的匹配
    contains:字符数据中包含等号后面的数据。
    icontains:跟contains,唯一不同是忽略大小写
    in:判断字符的数据是否处在一个给定的列表中,如果在,则提取出来,
    gt:大于。
    gte:大于等于。
    lt:小于。
    lte:小于等于
    startswith:以什么开始,
    istartswith:同startswith,忽略大小写。
    endswith:同startswith,以什么结尾。
    iendswith:同istartswith,以什么结尾。
    

#外键,多对多模型之间的访问
    例如访问一个外键的数据
    作者:
        class a(models.Model):
            name = models.CharField(max_length=100) 
        
    
    博客:
        class b(models.Model):
            author = models.Foreginkey('a')
        
        blog = b.objects.all()
        blog.author.name 
        
    反项查询,比如作者要查询博客:
        blog = AuthorModel.objects.all().first()
        blogSet = blog.BlogModel_set.all()
        

models常用字段

class Meta:
    ordering = ['create_time'] #排序方式,可多选
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值