django入门笔记5- model
2013-05-01 09:55
363 查看
模型定义
1.settings里面定义
INSTALLED_APPS= (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'myapp',
)
2.在app中定义模型
fromdjango.db import models
classBook(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()
num_pages= models.IntegerField(blank=True, null=True)
authors= models.ManyToManyField(Author) #多对多
publisher= models.ForeignKey(Publisher) #外键
publication_date= models.DateField() #时间
3.检查模型的有效性
pythonmanage.py validate
查看生成的sql语句
pythonmanage.py sqlall books
4.同步DB
pythonmanage.py syncdb
模型定义高级
模型的默认输出:
def__unicode__(self):
returnu'%s %s' % (self.first_name, self.last_name)
模型的默认排序(在model的内部)
classMeta:
ordering= ['name']
使用模型
新建:
方法1:
p1= Publisher(name='Apress', address='2855 Telegraph Avenue',
city='Berkeley',state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
p1.save()
方法2:
p1= Publisher.objects.create(name='Apress',
address='2855Telegraph Avenue',
city='Berkeley',state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
查询:
查询所有:
publisher_list= Publisher.objects.all()
过滤(返回的是一个数组,可能为空)
Publisher.objects.filter(country="U.S.A.",state_province="CA")
获得一个(不同于上面的是只返回一个变量,如果得到多个或者空会报错,一般查询都是会用pk=xxx):
Publisher.objects.get(country="U.S.A.",state_province="CA")
模糊查询(相当于like),可以多个联合:
Publisher.objects.filter(name__contains="press")
排序:
Publisher.objects.order_by("name")
Publisher.objects.order_by("-name")
Publisher.objects.order_by("state_province","address")
Q表达式(主要用于复杂的逻辑判断查询,比如或查询):
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005,5, 2)) | Q(pub_date=date(2005, 5, 6))
)
查询外键对象
b.publisher.website
外键对象反向访问
publisher.book_set.all()
查询对对多对象
b.author.all()
反向访问
author.book_set.all()
更改:
方法1:
Publisher.objects.filter(id=52).update(name='ApressPublishing')
删除:
方法1:
p= Publisher.objects.get(name="O'Reilly")
p.delete()
方法2:
Publisher.objects.all().delete()
模型的自带方法(处理单条数据)
1.定义:
classPerson(models.Model):
birth_date= models.DateField()
address= models.CharField(max_length=100)
city= models.CharField(max_length=50)
state= USStateField() # Yes, this is U.S.-centric...
defbaby_boomer_status(self):
"Returnsthe person's baby-boomer status."
importdatetime
ifdatetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12,31):
return"Baby boomer"
ifself.birth_date < datetime.date(1945, 8, 1):
return"Pre-boomer"
return"Post-boomer"
2.用法:
p= Person.objects.get(first_name='Barack', last_name='Obama')
p.baby_boomer_status()
模型的封装方法manager(处理全局返回数据)
入门定义
1.定义一个manager,可以直接写在model.py里:
classBookManager(models.Manager):
deftitle_count(self, keyword):
**returnself.filter(title__icontains=keyword).count()
2.在model中引用
classBook(models.Model):
num_pages= models.IntegerField(blank=True, null=True)
objects= BookManager()
3.使用方式
Book.objects.title_count('django')
多个manger(使用的场景应该不多):
objects= models.Manager()
dahl_objects= DahlBookManager()
附录:查询mysql的原始方式
from django.shortcuts importrender_to_response
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret',host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('book_list.html', {'names': names})
1.settings里面定义
INSTALLED_APPS= (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'myapp',
)
2.在app中定义模型
fromdjango.db import models
classBook(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()
num_pages= models.IntegerField(blank=True, null=True)
authors= models.ManyToManyField(Author) #多对多
publisher= models.ForeignKey(Publisher) #外键
publication_date= models.DateField() #时间
3.检查模型的有效性
pythonmanage.py validate
查看生成的sql语句
pythonmanage.py sqlall books
4.同步DB
pythonmanage.py syncdb
模型定义高级
模型的默认输出:
def__unicode__(self):
returnu'%s %s' % (self.first_name, self.last_name)
模型的默认排序(在model的内部)
classMeta:
ordering= ['name']
使用模型
新建:
方法1:
p1= Publisher(name='Apress', address='2855 Telegraph Avenue',
city='Berkeley',state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
p1.save()
方法2:
p1= Publisher.objects.create(name='Apress',
address='2855Telegraph Avenue',
city='Berkeley',state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
查询:
查询所有:
publisher_list= Publisher.objects.all()
过滤(返回的是一个数组,可能为空)
Publisher.objects.filter(country="U.S.A.",state_province="CA")
获得一个(不同于上面的是只返回一个变量,如果得到多个或者空会报错,一般查询都是会用pk=xxx):
Publisher.objects.get(country="U.S.A.",state_province="CA")
模糊查询(相当于like),可以多个联合:
Publisher.objects.filter(name__contains="press")
排序:
Publisher.objects.order_by("name")
Publisher.objects.order_by("-name")
Publisher.objects.order_by("state_province","address")
Q表达式(主要用于复杂的逻辑判断查询,比如或查询):
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005,5, 2)) | Q(pub_date=date(2005, 5, 6))
)
查询外键对象
b.publisher.website
外键对象反向访问
publisher.book_set.all()
查询对对多对象
b.author.all()
反向访问
author.book_set.all()
更改:
方法1:
Publisher.objects.filter(id=52).update(name='ApressPublishing')
删除:
方法1:
p= Publisher.objects.get(name="O'Reilly")
p.delete()
方法2:
Publisher.objects.all().delete()
模型的自带方法(处理单条数据)
1.定义:
classPerson(models.Model):
birth_date= models.DateField()
address= models.CharField(max_length=100)
city= models.CharField(max_length=50)
state= USStateField() # Yes, this is U.S.-centric...
defbaby_boomer_status(self):
"Returnsthe person's baby-boomer status."
importdatetime
ifdatetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12,31):
return"Baby boomer"
ifself.birth_date < datetime.date(1945, 8, 1):
return"Pre-boomer"
return"Post-boomer"
2.用法:
p= Person.objects.get(first_name='Barack', last_name='Obama')
p.baby_boomer_status()
模型的封装方法manager(处理全局返回数据)
入门定义
1.定义一个manager,可以直接写在model.py里:
classBookManager(models.Manager):
deftitle_count(self, keyword):
**returnself.filter(title__icontains=keyword).count()
2.在model中引用
classBook(models.Model):
num_pages= models.IntegerField(blank=True, null=True)
objects= BookManager()
3.使用方式
Book.objects.title_count('django')
多个manger(使用的场景应该不多):
objects= models.Manager()
dahl_objects= DahlBookManager()
附录:查询mysql的原始方式
from django.shortcuts importrender_to_response
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret',host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render_to_response('book_list.html', {'names': names})
相关文章推荐
- Django入门学习笔记(一) 单个model的保存
- django入门笔记-1
- django入门笔记4- template
- python学习笔记--Django入门二 Django 的模板系统
- python学习笔记--Django入门四 管理站点
- Django学习笔记:为Model添加Action
- [机器学习入门] 李宏毅机器学习笔记-5(Classification- Probabilistic Generative Model;分类:概率生成模型)
- [机器学习入门] 李宏毅机器学习笔记-19 (Deep Generative Model-part 2:深度生成模型-part 2)
- [机器学习入门] 李宏毅机器学习笔记-20 (Deep Generative Model-part 3:深度生成模型-part 3)
- Django Crusher 入门笔记(1)
- django入门笔记
- Crusher DJango 入门笔记(7) 学习基本http协议
- Django Crusher 入门笔记(2)
- Django2.0 学习笔记(一)-->新手入门
- Django入门笔记【五】
- django 中Model一些笔记--收藏
- django入门笔记-2
- Django Crusher 入门笔记(3)
- 【day 13】python编程:从入门到实践学习笔记-基于Django框架的Web开发-Django入门(四)
- [机器学习入门] 李宏毅机器学习笔记-25(Sturctured Linear Model;结构化预测-线性模型)