您的位置:首页 > 编程语言 > Go语言

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})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: