Skip to content Skip to main navigation Skip to footer

Python: Python笔记(六)- 模型及Django站点管理

在这篇博文中,将介绍django与数据库方面的交互的知识。首先在网上下载Python For MySQL,然后进行安装。安装成功之后,在setting.py文件中进行装载,如下:

 1  DATABASES = {
  2  ' default ' : {
  3  ' ENGINE ' : ' django.db.backends.mysql ' ,
  4  ' NAME ' : ' database ' , # 首先要在MySQL中建立一个数据库叫database
 5  ' USER ' :' root ' ,  # 你数据库的用户
 6  ' PASSWORD ' :' root ' ,  # 你数据库的密码
 7  ' HOST ' :' 127.0.0.1 ' ,
  8  ' PORT ' :' 3306 '
 9      }
 10  } 

配置好之后,如果没有错的话,进入项目所在目录,在命令行中运行python manage.py shell来进行测试。如果输入下面这段代码没有显示什么错误信息,就证明你的数据库配置正确了。之后就能进行增删改查操作。

1  from  django.db import  connection
 2  cursor = connection.cursor() 

下面假设你的数据库配置正确了。我们将演示如何进行增删改查操作。

首先在app应用中添加模型,我这里添加了3个,分别如下:

 1  # encoding=utf-8
 2  from  django.db import  models
  3
 4  # 建立模型,对应MySQL中的表
 5  #  Create your models here.
 6
 7  class  Publisher(models.Model):
  8      name = models.CharField(max_length = 30)    # 字段名以及类型指定
 9      address = models.CharField(max_length = 50)
 10      city = models.CharField(max_length = 50)
 11      state_province = models.CharField(max_length = 50)
 12      country = models.CharField(max_length = 50,blank=True)# blank=True表明字段可以为空
13      website = models.URLField(blank=True) # Python提供的特定URL形式
14
15  def  __unicode__ (self):  # 相当于Java中的toString()
16  return  u' id=%d,name=%s ' %(self.id,self.name)
 17
18  class  Meta: # 指定之后查出的结果集按照id的升序排列,使用ordering=['-id']则为降序.
19          ordering = [' id ' ]
 20
21  class  Author(models.Model):
 22      first_name = models.CharField(max_length = 50)
 23      last_name = models.CharField(max_length = 50)
 24      email = models.EmailField() # Python提供的特定Email格式x
25
26  def  __unicode__ (self):
 27  return  u' firstname=%s '  %self.first_name
 28
29  class  Meta:
 30          ordering = [' id ' ]
 31
32  class  Book(models.Model):
 33      title = models.CharField(max_length = 50)
 34      author = models.ManyToManyField(Author) # book和author为多对多
35      publisher = models.ForeignKey(Publisher)# 外键
36      publication_date = models.DateField()   # Python提供的特定日期格式
37
38  def  __unicode__ (self):
 39  return  self.title
 40
41  class  Meta:
 42          ordering = [' id ' ] 

上面的代码请参看其后注释,很容易理解。简历好模型之后(模型对应我们在数据库中表),我们在setting.py中的INSTALLED_APPS元组里对我们的项目进行注册。然后使用python manage.py syncdb命令创建数据库中的表。创建成功之后,在tests.py里面对数据库进行操作(不是一定要在这个文件里)。

插入数据

先看下面这段代码:

 1  # encoding=utf-8
 2  # Create your tests here.
 3  from  Second.models import  Publisher
  4  # 插入对象
 5  p1 = Publisher(name=' zhouxy ' ,address=' nenu-software ' ,city=' 长春 ' ,state_province=' CA ' ,country=' China ' ,website=' www.cnblogs.com/zhouxuanyu ' )
  6  p1.save();
  7  p2 = Publisher(name=' zhouxuanyu ' ,address=' nenu-software ' ,city=' 长春 ' ,state_province=' CA ' ,country=' China ' ,website=' www.cnblogs.com/zxyyxzshine ' )
  8  p2.save();
  9  publisher_list = Publisher.objects.all();
 10  print  publisher_list 

在上面第5,7行创建两个对象p1,p2。然后我们分别调用它们的save()方法,将其插入数据库。9,10行打印出这两个对象的信息。打印的信息就是我们在model中定义Publisher的时候所定义的__unicode__函数返回的值。类似于Java中对象的toString()。下面是结果图:

我们可以使用python manage.py sqlall Second命令来显示MySQL语法。(版面原因,我只截部分图)

查询数据

1  # 查询对象
2  print  Publisher.objects.filter(name=' zhouxy ' ).order_by(' id ' ) # 等同于在sql中使用where关键字,也可以在model中添加class Meta:
3  print  Publisher.objects.filter(name=' zhouxy ' ,city=' 长春 ' ) # 等同于在sql中使用where和and关键字
4  print  Publisher.objects.filter(name__contains=' zhouxy ' )[0:2] # sql缺省=操作符是精确匹配,字段__contains相当于sql中的like,切片操作符等同于sql中的offset..limit..
5  print  Publisher.objects.get(name=' zxyyxzshine ' ,id=2) # 获取单个对象  

对照注释,很容易理解。filter()等同于sql中的where关键字。order_by()等同于sql中的order by语句。如果在filter中添加一个以上的条件,那么就相当于在sql中在条件语句中使用and关键字将条件结合起来。

更新数据

1  # 更新对象
2  print  Publisher.objects.filter(id=1).update(name=" zxyyxzshine >" ) # 返回更新成功的row数
3  print  Publisher.objects.filter(name=' zhouxuanyu ' ).update(name=' zxyyxzshine ' ) 

删除对象

1  # 删除对象
2  print  Publisher.objects.filter(id=1).delete()
 3  print  Publisher.objects.all().delete() 

原文:http://www.cnblogs.com/zhouxuanyu/p/4564162.html

0 Comments

There are no comments yet

Leave a comment

Your email address will not be published.