Django笔记-模型(二)

新建project步骤省略,具体可参照http://5007260.blog.51cto.com/4997260/1310954

1、基础篇

cd /app && python /usr/local/bin/django-admin.py startproject shenpi #建站点
cd /app/shenpi
python manage.py startapp data#data 模型需要建一个独立的app
python manage.py validate #检测model.py是否存在语法错误
python manage.py sqlall data #(存放model.py app名字)
python manage.py syncdb#真正建表的动作
python manage.py dbshell#这个命令将依据`` DATABASE_SERVER`` 的里设置自动检测使用哪种命令行客户端直接进入数据库会话

#module.py
from django.db import models
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 Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()
    **def __unicode__(self):**
        **return u'%s %s' % (self.first_name, self.last_name)**
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    **def __unicode__(self):**
        **return self.title**
#查询数据
Publisher.objects.all() #取出模型中Publisher表所有数据
Publisher.objects.order_by("name")#order by 用法,字段前加-name 逆序
Publisher.objects.filter(name='Apress')#字段where name='Apress'的数据
Publisher.objects.filter(country="U.S.A.", state_province="CA")#多where条件查询
Publisher.objects.filter(name__contains="press")#contains部分会被Django翻译成LIKE语句,等价于下面sql语句
Publisher.objects.order_by('name')[0]#limit 1用法,
#get/filter比较
#filter()函数返回一个记录集,这个记录集是一个列表。get()获取单个的对象

#插入数据
p = Publisher(name='Apress',
... address='2855 Telegraph Ave.',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='
p.save() 

#更新数据
Publisher.objects.filter(id=52).update(name='Apress Publishing')
Publisher.objects.all().update(country='USA')

#删除数据
Publisher.objects.filter(country='USA').delete()


2、高级篇

#一个改变模型结构的步骤
首先,进入开发环境(也就是说,不是在发布环境里):
1. 在你的模型里添加字段。
2. 运行 manage.py sqlall [yourapp]来测试模型新的 CREATE TABLE语句。 注意为新字段的列定义。
3. 开启你的数据库的交互命令界面(比如, psql或mysql, 或者可以使用 manage.py dbshell)。 执行
ALTER TABLE语句来添加新列。
4. 使用Python的manage.py shell,通过导入模型和选中表单(例如, MyModel.objects.all()[:5])来验证
新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。
然后在你的产品服务器上再实施一遍这些步骤。
1. 启动数据库的交互界面。
2. 执行在开发环境步骤中,第三步的ALTER TABLE语句。
3. 将新的字段加入到模型中。 如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境
上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行svn update。
4. 重新启动Web server,使修改生效。
#生产环境添加/删除字段实例
ALTER TABLE books_book ADD/DROP COLUMN num_pages integer;
>>> from mysite.books.models import Book #验证是否添加成功
>>> Book.objects.all()[:5]

#增加额外的Manager方法
>>>增加额外的manager方法是为模块添加表级功能的首选办法。额外的manager是为了将经常使用的操作进行封装,这样我们就不必重复编码了
from django.db import models
**# First, define the Manager subclass.**
**class DahlBookManager(models.Manager):**
    **def get_query_set(self):**
        **return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl')**
**# Then hook it into the Book model explicitly.**
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
# ...
**objects = models.Manager() # The default manager.**
**dahl_objects = DahlBookManager() # The Dahl�\specific manager.**

#模型方法
>>>为了给你的对像添加一个行级功能,那就定义一个自定义方法。 有鉴于manager经常被用来用一些整表操作
(table-wide),模型方法应该只对特殊模型实例起作用。
from django.contrib.localflavor.us.models import USStateField
from django.db import models
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    state = USStateField() # Yes, this is U.S.�\centric...
def is_midwestern(self):
"Returns True if this person is from the Midwest."
    return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO')
def _get_full_name(self):
"Returns the person's full name."
    return u'%s %s' % (self.first_name, self.last_name)
full_name = property(_get_full_name)

#用法实例
>>> p = Person.objects.get(first_name='Barack', last_name='Obama')
>>> p.is_midwestern()
True
>>> p.full_name # Note this isn't a method �\�\it's treated as an attribute
u'Barack Obama'

#执行原始sql查询
Django数据库API带给你的也只有这么多,那你可以为你的数据库写一些自定义SQL查询。 你
可以通过导入django.db.connection对像来轻松实现,它代表当前数据库连接。 要使用它,需要通
过connection.cursor()得到一个游标对像。 然后,使用cursor.execute(sql, [params])来执行SQL语句,使
用cursor.fetchone()或者cursor.fetchall()来返回记录集,
#sql查询代码不要和视图混淆,尽量放在module.py代码中
from django.db import connection
def sqlSelect(sql):
    cursor = connection.cursor()
    cursor.execute(sql)
    return cursor.fetchall()
#cursor.execute()的SQL语句中使用`` “%s”`` ,而不要在SQL内直接添加参数。 如果你使
用这项技术,数据库基础库将会自动添加引号,同时在必要的情况下转意你的参数
>>> cursor.execute("""SELECT DISTINCT first_name FROM people_person WHERE last_name = %s""", ['Lennon'])



你可能感兴趣的:(数据库,django,python,模型)