Django -- 模型(数据库层)

发布时间:2021-08-02 23:24 来源:https://blog.51cto.com/tengxia 阅读:134 作者:Ohimma 栏目: web开发

[<Publisher: Apress>]          #filter == where
<Publisher: Apress>
>>> Publisher.objects.order_by("state_province", "address")

插入两个数据后,讲道理Publisher.objects.all()方法会取出Publisher类的对象,但是却没有得到有用信息;

直接删除:>>> Publisher.objects.filter(country='USA').delete()  #删除所有country='USA'的

web应用中,主观逻辑(视图处理)经常牵涉与数据库的交互。数据库驱动网站在后台连接数据库,从中取数据,然后甩漂亮界面展现在web端。许多复杂的网站都提供以上两种功能的结合(如Amazon.com),而Python天生具备简单强大的数据库查询执行方法,很适合开发这类数据库驱动网站。

保存数据:>>> p2.save()    #他会update此id全部字段,不只是name字段;也有轻量级更改的方法。

1、数据查看、过滤操作:
[<Publisher: Apress>]          #逗号转换成了 and
vim ~/HelloWorld/mysql_django/models.py    class Publisher(models.Model):     def __unicode__(self):       return self.name **   class Meta:               **     ordering = ['name']  #Meta类,默认会以name字段进行排序

3、连锁查询:

T:表现层,处理与表现相关的决定,比如页面如何显示;

启动shell界面:python manage.py  shell

>>> from django.db import connection

那我们能不能像上节那样创建模板,其实django提供了更简单直接的方式:数据库API

vim ~/HelloWorld/mysql_django/models.py from django.db import models class Publisher(models.Model): #CREATE TABLE "books_publisher"("id" serial NOT NULL PRIMARY KEY,     name = models.CharField(max_length=30)   #"name" varchar(30) NOT NULL,    address = models.CharField(max_length=50) #"address" varchar(50) NOT NULL,    city = models.CharField(max_length=60)    #"city" varchar(60) NOT NULL,    state_province = models.CharField(max_length=30) #"state_province" varchar(30) NOT NULL,    country = models.CharField(max_length=50) #"country" varchar(50) NOT NULL,    website = models.URLField()        #"website" varchar(200) NOT NULL );                          class Author(models.Model):    first_name = models.CharField(max_length=30)    last_name = models.CharField(max_length=40)    email = models.EmailField()     class Book(models.Model):              title = models.CharField(max_length=100)               authors = models.ManyToManyField(Author)    publisher = models.ForeignKey(Publisher)    publication_date = models.DateField()

代码解读:

>>> Publisher.objects.order_by('name')[0]    #[0]=limit 1;不支持负索引[-1],但可用降序[0]实现

2、每个模型相当于数据库表,每个属性即字段,类型(CharField)相当于字段类型(varchar)

MySQL   mysql    

python  manage.py  check   

删除全部:>>> Publisher.objects.all().delete()            #不加all()方法删除不了

[<Publisher: O'Reilly>, <Publisher: Apress>]     #-号,表示逆向排序

1、首先每个数据模型都是django.db.models.Model的子类,父类Model包含所有与数据库交互的必要方法;

python  manage.py  sqlmigrate  mysql_django  0001

添加数据:>>> p3 = ....name='Apress' ...

============================================================================================

Django 设计遵循松耦合原则,修改某部分不影响其他部分。视图函数中通过了模板系统将业务逻辑和表现逻辑分隔,数据库层也应如此。

vim ~/HelloWorld/mysql_django/models.py from django.db import models class Publisher(models.Model):      name = models.CharField(max_length=30)      ......................      website = models.URLField() **      def __unicode__(self): **       return self.name class Author(models.Model):      ......................... **    def __unicode__(self): **       return u'%s %s' % (self.first_name, self.last_name)** class Book(models.Model):      ......................... **    def __unicode__(self): **       return self.title

============================================================================================

4、定义了出版商、作者、书籍的一些内容。

PostgreSQL   postgresql_psycopg2    

python  manage.py  migrate

第 一 个 app 
>>> Publisher.objects.get(name="Apress")

PostgreSQL   postgresql    

2、数据排序操作:

a、检查语法错误(django1.9.0版本以下用 python manage.py validate)

MVC 架构模式:即数据存取逻辑(model)、表现逻辑(view)、业务逻辑(controller)的组合

数据库   DATABASE_ENGINE   适配器  

================================================================================================

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})

弊端:此方法虽可用,但是我们将参数配置直接硬编码到视图函数,显然犯了前两节相同的错误;如果我们改一个参数、改一种数据库、换个执行语句等等,都会引起大范围的改动。

免责声明:本站发布的内容(图片、视频和文字)以原创、来自互联网转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:ts@56dr.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。