Django 之 (6)模型(数据库)

Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。

一、 基本用法

1、修改models.py文件,我们先新建一个Person类,继承自models.Model, 一个人有姓名和年龄。

from django.db import models
 
 
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()


这里用到了两种Field,更多Field类型可以参考教程链接:https://docs.djangoproject.com/en/dev/ref/models/fields/

 

2、创建数据表

两个命令:

# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate


3、使用Django提供的QuerySet API

3.1 创建一个对象有一下几种方法:

  1. Person.objects.create(name=name,age=age)

  2. p = Person(name="WZ", age=23)

    p.save()

  3. p = Person(name="TWZ")

    p.age = 23

    p.save()

  4. Person.objects.get_or_create(name="WZT", age=23)

    这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

 

3.2 获取对象的方法:

  1. Person.objects.all()

  2. Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

  3. Person.objects.get(name=name)     #获取单个对象

    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

  4. Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人

  5. Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件

  6. Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人

  7. Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写

  8. Person.objects.filter(name__regex="^abc")  # 正则表达式查询

  9. Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写

    filter是找出满足条件的,当然也有排除符合某条件的

  10. Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

  11. Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23岁的

说明: = 表示精确匹配,字段后加双下划线,则contais部分会被翻译成LIKE 

   12. 对任意字段排序: Person.object.order_by("address")

         如果是逆向排序,则在address前面加一个减号-前缀

         说明:如果在Model.py 的Person类中添加如下代码,则表示,使用Django的数据库API检索时,返回值都会按照name字段排序:

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField()
    
    def __unicode__(self): return self.name

    **class Meta:**
        **ordering = ['name']**

 

 

 

3.3 一些命令 

通过已有数据库创建Model类:

 $ python manage.py inspectdb

通过Model类生成MySQL语句:

$ python manage.py sqlall app_name

检查模型语法和逻辑是否正确:

$ python manage.py validate

提交sql语句至数据库:

$ python manage.py syncdb

进入数据库:

$ python manage.py dbshell

 

3.4 一些语法

查看models 对应的sql语句:(用query)

 def get_result_by_task_id(task_id):
        print str(models.MetricsResult.objects.filter(task_id=task_id).query)
        return models.MetricsResult.objects.filter(task_id=task_id)


group by 的用法

 

UserData.objects.filter(hubid=sensorid,time__range=(time2,time1)).values('hour').annotate(sum_out=Sum('outdoor'), sum_in=Sum('indoor'), sum_eat=Sum('kitchen'), sum_wash=Sum('toilet')).order_by('hour')

 

上述代码相当于:

select Sum('outdoor') as sum_out,Sum('indoor') as sum_in,Sum('kitchen') as sum_eat,Sum('toilet') as sum_wash,hour
where hubid='sensorid' and (time between time1 and time2)
group by hour
order by hour asc


其他一下models用法:

http://www.cnblogs.com/wspblog/p/6358819.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值