• 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()
  • 相关阅读:
    Centos 设置开机进图形界面/终端
    Ubuntu 开机慢(networking.service导致)
    Linux 内核下载地址
    C/C++中内存对齐
    编译器数据模型
    CPU中断
    sql语句
    mysql学习
    Active进阶
    SpringBoot整合ActiveMQ
  • 原文地址:https://www.cnblogs.com/zhouxuanyu/p/4564162.html
Copyright © 2020-2023  润新知