Django-模型

django的models负责数据库层的交互。
×××××××××××××××××××××××××××××××××××××
在django1.8中,在models.py中建立好class 。。。即各种表和字段后,使用python manage.py check(不是python manage.py validate) 来检查模型的有效性。使用python manage.py makemigrations和python manage.py migrate来提交到数据库(不是python manage.py syncdb)。
×××××××××××××××××××××××××××××××××××××


老方法:
from django.shortcuts import render_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})


python的django数据库层方法:
from django.shortcuts import render_to_response
from mysite.books.models import Book
def book_list(request):
books=Book.objects.order_by(‘name’)
return render_to_response(“book_list.html”,{“books”:books})


在modules.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()

相当于sql语句:
CREATE TABLE “books_publisher” (
“id” serial NOT NULL PRIMARY KEY,
“name” varchar(30) NOT NULL,
“address” varchar(50) NOT NULL,
“city” varchar(60) NOT NULL,
“state_province” varchar(30) NOT NULL,
“country” varchar(50) NOT NULL,
“website” varchar(200) NOT NULL
);

“每个数据库表对应一个类”这条规则的例外情况是多对多关系。

用命令python manage.py validate来检验创建的模型的有效性

用命令来python manage.py sqlall books生成sql语句,运行后生成上面的sql语句,自动生成的表明是app名+下划线+小写类名,自动加一个id主键

使用命令python manage.py syncdb 来提交命令到数据库。若不存在则创建,存在则不作处理。如果对其中某些模型做了修改,syncdb也不会将删除或修改同步到数据库。


from books.models import Publisher
p1=Publisher(name=’Apress’,address=’2855 Telegraph Avenue’,city=’Berkeley’,state_province=’CA’, country=’U.S.A.’,website=’http://www.apress.com/‘)
p1.save()
publisher_list=Publisher.objects.all()
publisher_list
[out]:[< Publisher: Publisher object>]
(1)导入Publisher类,通过这个类可以和数据库中的相应表进行交互
(2)创建一个Publisher实例,并设置了相应字段
(3)调用实例的save方法,此时,django在后台执行insert语句,相应数据插入到表中
(4)使用Publisher.objects从数据库中取出相应信息,但是只能显示对象,除非在类中加入unicode()方法。

p1 = Publisher.objects.create(name=’Apress’,
… address=’2855 Telegraph Avenue’,
… city=’Berkeley’, state_province=’CA’, country=’U.S.A.’,
… website=’http://www.apress.com/‘)
此时一条语句即完成了数据的插入。

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**

插入和更新数据

通过创建实例,进行赋值和调用save方法在数据库相应表中插入数据。
在插入新的数据,使用save方法后,如果再对同一实例字段进行赋值,并调用save方法,此时只是更新数据(update)

数据过滤:filter()方法
Publisher.objects.filter(name=”San”)
[out]:[< Publisher: San>]
filter()根据参数来转换成where子句。
Publisher.objects.filter(country=”U.S.A.”, state_province=”CA”)
多个参数会被转换成 AND SQL从句。
并且“=”是精确匹配的,要想使用模糊匹配可以使用
Publisher.objects.filter(name__contains=”press”),在name和contains之间有双下划线。这里相当于WHERE name LIKE ‘%press%’;
Publisher.objects.get(name=”San”)获取单个对象而不是列表,如果结果是多个对象会抛出异常。没有查询结果也会抛出异常。
try:
p = Publisher.objects.get(name=’Apress’)
except Publisher.DoesNotExist:
print “Apress isn’t in the database yet.”
else:
print “Apress is in the database.”


使用Publisher.objects.order_by(“name”)排序
Publisher.objects.order_by(“-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']

class Meta是内嵌于Publisher的类的定义中的,如果class Publisher是 顶格的,那么class Meta要在它之下缩进4个空格。

Publisher.objects.filter(country=”U.S.A.”).order_by(“-name”)
Publisher.objects.order_by(‘name’)[0]
Publisher.objects.order_by(‘name’)[0:2]
不支持python的负索引: Publisher.objects.order_by(‘name’)[-1]是要抛异常的。

更新多个对象:
p=Publisher.objects.get(name=”San”)#可能有多个记录
p.name=”zhangsan”
p.save()
这样不仅仅会更新name列,其他列也会有更新(不会改变),这样,当有其他进程在修改表时,可能会造成冲突。
下面可以只修改name一列,调用结果集的update方法。
Publisher.objects.filter(id=52).update(name=’Apress Publishing’)
此条语句返回受影响的记录条数

删除记录使用实例的delete方法。p.delete(),Publisher.objects.filter(country=’USA’).delete(),Publisher.objects.all().delete(),
Publisher.objects.filter(country=’USA’).delete()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值