您好,欢迎访问一九零五行业门户网

Django中的模型与数据库(Models and database)

django中的模型与数据库(models and database) 对于数据库大家都不陌生,但是models该怎么理解,官方文档中有这么一句话: a model is the single, definitive source of data about your data. it contains the essential fields and behaviors of thedata yo
django中的模型与数据库(models and database)
对于数据库大家都不陌生,但是models该怎么理解,官方文档中有这么一句话:
a model is the single, definitive source of data about your data. it contains the essential fields and behaviors of thedata you’re storing. generally, each model maps to a single database table.
下文暂且称models为“模型”(个人叫法)
那么,模型具备以下三个特征:
每一个模型都是一个python子类。继承django.db.models.model模型的每一个属性代表一个数据库字段除了上述之外,jango还提供了自动生成数据库访问的api为了方便理解我们举个例子下面这个例子我们建立了一个person的模型,且有两个字段)first_name,last_name
from django.db import modelsclass person(models.model): first_name = models.charfield(max_length=30) last_name = models.charfield(max_length=30)first_name和last_name是person模型的field,每一个field都是一个指定的类的属性,每一个属性映射到数据库的没一列
这里我就有一个疑问,到底field能不能称为字段?
上面的person模型将会对应一张这样的数据库表:create table myapp_person ( id serial not null primary key, first_name varchar(30) not null, last_name varchar(30) not null);下面我们聊聊使用,一旦你声明了一个models,你需要去告诉jango你将会去使用该models,在你的settings里把你的应用名加到installed_apps中installed_apps = (#...’myapp’,#...)当你在installed_apps添加新应用后,需要执行manage.py migrate
接下来我们再来说说fields
它是模型的重要的一部分,它定义了数据库表的字段from django.db import modelsclass musician(models.model): first_name = models.charfield(max_length=50) last_name = models.charfield(max_length=50) instrument = models.charfield(max_length=100) class album(models.model): artist = models.foreignkey(musician) name = models.charfield(max_length=100) release_date = models.datefield() num_stars = models.integerfield()模型中每一个field是一个field类实例,jango通过field类类型去确定一下几个点。1.数据库字段的类型2.使用默认的html部件但渲染表单的field时(e.g. ,)
field option
每一个field都有一个特定参数,例如charfield,max_lengthnull 如果是真,jango将会存储空值null进数据库 默认为falseblank 如果为真,field将会允许空格的输入, 默认为falsechoices 一个二位元组,如果field中使用choices 则在前端展示的html组件就是
举个例子
year_in_school_choices = ((’fr’, ’freshman’),(’so’, ’sophomore’),(’jr’, ’junior’),(’sr’, ’senior’),(’gr’, ’graduate’),)from django.db import modelsclass person(models.model): shirt_sizes = ( (’s’, ’small’), (’m’, ’medium’), (’l’, ’large’), ) name = models.charfield(max_length=60) shirt_size = models.charfield(max_length=1,choices=shirt_sizes)>>> p = person(name=fred flintstone, shirt_size=l)>>> p.save()>>> p.shirt_sizeu’l’>>> p.get_shirt_size_display()u’large’
save()
这个在后台执行了一个插入sql。但是并没有真正的导数据库知道用户执行了save(),save()没有返回值,但是save()支持参数
model.save ([force_insert=false, force_update=false, using=default_db_alias, update_fields=none] )
当你执行save()操作,jango执行以下步鄹
1:触发pre-save事件,这个信号,任何一个函数都可以监听这个事件
2:一些有特殊的字段类型的字段做处理,例如datefield和auto_now=true这时候得到的值是jango生成的时间,这里要注意的是,数据库的时间可能跟服务器的不一样,所以这里要注意时间同步。
3:为插入准备数据,每一个字段提供一个处理后的值
4:为插入准备sql,这里我理解为拼sql
5:发给数据库执行sql
all()
all_entries = entry.objects.all() 查看所有的内容filter(**kwargs)我们现在看下通过过滤器(filters)获取具体的值entry.objects.filter(pub_date__year=2006)exclude(**kwargs)entry.objects.filter(... headline__startswith=’what’... ).exclude(... pub_date__gte=datetime.date.today()... ).filter(... pub_date__gte=datetime(2005, 1, 30)… )返回除去与查找条件相符的数据get()如果想要返回指定的一个数据one_enty = entry.objects.get(pk=1)
字段查询 __id被指定的查询字段名字必须是模型field名字相对应,除非外键的情况entry.objects.filter(blog_id=4)这时候返回并不是entry中id=4的数据行,而是id对应主键算在的数据行
__exact最普通的情况(默认添加)entry.objects.get(headline__exact=man bites dog)翻译成sql就为select ... where headline = ’man bites dog’;blog.objects.get(id__exact=14) # 明确的形式blog.objects.get(id=14) # __exact 默认添加
__iexactblog.objects.get(name__iexact=beatles blog)结果可能是 beatles blog, beatles blog, or beatles blog.不区分大小写
__containsentry.objects.get(headline__contains=’lennon’)模糊搜索,翻译成sqlselect ... where headline like ’%lennon%’;
__ icontainsentry.objects.get(headline__icontains=’lennon’)sql:select ... where headline ilike ’%lennon%’;
__inentry.objects.filter(id__in=[1,3,4]sql:select … where id in (1,3,4);这种也可以用复合sql的形式表示 inner_qs = blog.objects.filter(name__contains=’cheddar’)entries = entry.objects.filter(blog__in=inner_qs)sql:select ... where blog.id in (select id from ... where name like ’%cheddar%’)
__gt 大于entry.objects.filter(id__gt=4)sql:select … where id > 4__gte 大于等于__lt 小于__lte 小于等于
__rangeimport datetimestart_date = datetime.date(2005, 1, 1)end_date = datetime.date(2005, 3, 31)entry.objects.filter(pub_date__range=(start_date, end_date))sql:select ... where pub_date between ’2005-01-01’ and ’2005-03-31’;
__yearentry.objects.filter(pub_date_year=2005)sql:select … where pub_date between ‘2005-01-01’ and ‘2005-12-31’;
__month __day __hour __minuteentry.objects.filter(pub_date__month=12)sql:select ... where extract(’month’ from pub_date) = ’12’;
__isnullentry.objects.filter(pub_date__isnull=true)sql:select ... where pub_date is null;
其它类似信息

推荐信息