Django学习笔记3

思考:

说白了我后端到底是一个什么东西?其实后端要关注的点,只是不同网页之间
的连接关系(path),这个关系就像一个大家族各个成员之间亲属关系一样,前端的
代码本来也就只是一个壳,我要关注的只是别人点击这个东西会去到什么页面,来构建这些
页面之间的联系。而我每一种类型的页面就对应一个视图函数去展示
视图、页面、path其实是三角的关系

##对于制作过程中的思考:
从网页的效果出发,我点击可以产生多少个页面,就要写多少个视图函数(在构写视图函数的时候,要思考这个也面是否)


需求:利用数据库提取数据并呈现出来

##根据数据库提取的数据使得页面的数据是变化的

1.获得出所有数据的序列
2.DTL模板中用循环遍历这个序列
3.用变量代替

{% extends 'base.html' %}

{% block content %}
	<table>
		<thead>
			<tr>
				<th>序号</th>
				<tr>书名</tr>
				<tr>作者</tr>
			</tr>
		</thead>
		<tbody>
			{% for book in books %}
				<tr>
					<td>{{ forloop.counter}}</td>
					<td>{{ book.1 }}</td>
					<td>{{ book.2 }}</td>
				</tr>
			{% endfor %}
		</tbody>
	</table>
{% endblock %}

def get_corsor():
    return connection.cursor()

def index(request):
    cursor = get_corsor()
    cursor.execute("select id,name,author from book")
    books = cursor.fetchall()
    # 这时候的books是[(id,name,author),()]的形式列表里面包元组
    return render(request,'index.html',context={'books':books})

def add_book(request):
	if request.method == 'POST':
		name = request.POST.get('author')
		cursor = connection.cursor()
		cursor.execute("insert into book(id,name,author) value(null,'%s','%s'") % (name,author)
		return redirect(reverse('index'))
	else:
		return render(request,'add_book.html')

def book_detail(request,book_id):
	cursor = connection.cursor()
	cursor.execute("select * from book where id='%s'"% book_id)
	book = cursor.fetchone()
	return render(request,'book_detail.html',context={"book":book})

def delete_book(request):
	if request.method == 'POST':
		book_id = request.POST.get("book_id")
		cursor.execute("delete from book where id=%s" % book_id)
		return redirect(reverse('index'))

#ORM模型(对象关系映射)
通过类的方式去操作数据库,而不使用原生的sql语句,通过把表映射成类,把行作实例,把字段作为属性,orm在执行对象操作的时候最终是会把对应的操作转化为数据库原生语句。

使用ORM的优点:易用性,性能损耗小,设计灵活,可移植性好

from django.db import models

# 创建一个模型(类),对应数据库中的一个表
class Book(models,Model):
	# 模型中的一个属性,对应表中的一个字段
	id = models.AutoField()
	name = models.CharField(max_length=100)
	author = models.CharField(max_length=100)
	price = models.FloatField()

# 一个模型对象,对应数据库表中的一条数据
book = Book(name='三国演义',author='罗贯中',price=100)

# save方法,相当于将这条数据保存到数据库中(插入到表当中)
book.save()

# delete方法,相当于是将这条数据从数据库中删除(从表中删除)
book.delete()

创建ORM模型

用于替换直接使用SQL语句的方式,提升代码健壮性

##步骤:

(1).新建一个app,修改里面的models.py代码

from django.db import models

# 如果要将一个普通的类变成一个可以映射到数据库中的ORM模型
# 那么必须要将父类设置为models.Model或者他的子类
class Book(models.Model):
	# 确定这个表当中有什么字段
	# id int类型,自增长的
	# name varchar类型(100) 图书的名字
	# author varchar类型(100) 图书的作者
	# price float类型 图书的名字
	id = models.AutoField(primary_key=True)# Auto是自动增长的意思
	name = models.CharField(max_length=100,null=False)# 最长不超过100个字符,而且不能没有字符
	author = models.CharField(max_length=100,null=False)
	price = models.FloatField(null=False,default=0)# default的作用是如果在插入一条数据时没有给price指定一个值,就会使用默认的值

	# 即使没写id也会自动给你添加id

(2).把模型映射到数据库当中
1.生成迁移脚本文件
命令:python manage.py makemigrations
2.将新生成的迁移脚本文件映射到数据库中
命令:pyhton manage.py migrate

用ORM实现增删改查操作

1.新建一个app,app名放到settings中,并配置好settings里面的数据库信息

2.在app的models.py里面写一个类,写好信息对应的字段

from django.db import models

class Book(models.Model):
	name = models.CharField(max_length=100,null=False)
	author = models.CharField(max_length=100,null=False)
	price = models.FloatField(default=0)

	def __str__(self):# 重写类的__str__方法,使得在打印类的对象的时候可以输出自己想要的内容
		return "Book:({name},{author},{price})".format(name=self.name,author=self.author,price=self.price)

3.利用cmd命令把这个models映射到数据库中

python manage.py makemigrations
pyhton manage.py migrate

4.实现增删改查
app下面的views.py

from django.shortcuts import render
from .models import Book# 导入app中的model
from django.http import HttpResponse

def index(request):
	# 增加
	# 使用ORM添加一条数据到数据库中
	book = Book(name='三国演义',author='罗贯中',price=200)
	book.save()
	
	# 查询(所有的查找工作都是使用模型上的objects属性来完成的,也可以自定义查询对象)
	# 根据主键进行查询(pk=),pk就是primary_key
	book = Book.objects.get(pk=1)# 存在则返回一条主键=1的数据,不存在则抛出异常
	print(book)
	# 根据其他条件进行查找
	books = Book.objects.filter(name='西游记').first()# 把name=西游记的
	print(books)

	# 删除
	# 先把数据查找出来在删除
	book = Book.objects.get(pk=1)
	book.delete()

	# 修改数据
	# 先把数据从数据库查找出来在修改
	book = Book.objects.get(pk=1)
	book.price = 200# 修改
	book.save()# 保存

ORM模型中常用的字段

#如果在定义模型的时候没有给其定义主键,那么django会自动给其添加名为id的自增长的主键
#定义主键的时候一定要在后面加上primary_key=True这个参数值,不然django只会把其当做普通的字段进行处理

选择正确的field才能映射出正确的字段

#AutoField:
int类型,自增长类型,一般不使用这个字段,因为对应的数据会被自动添加上id

#BigAutoField:
64位整型的AutoField

用法:

class Article(models.Model):
	id = models.BigAutoField(primary_key=True)

#BooleanField:

如果有一篇文章,在写网站的时候,看有一篇文章是否被删掉,我们不能直接删除数据库里面对应的字段
而是添加一个叫removed的布尔值,表示文章是否被删掉,如果这个removed的字段为False则显示出来

app的models.py

class Article(models.Model):
	id = models.BigAutoField(primary_key=True)
	# 定义字段的时候,如果没有指定null=True,那么默认情况下,null=False
	# removed = models.BooleanField()
	# 如果想要使用可以为null的BooleanField,那么应该使用NullBooleanField来代替
	removed = models.NullBooleanField()

app的views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Article

def index(request):
	article = Article(removed=False)
	article.save()
	return HttpResponse('success')


#CharField:
可变长度的字符串,一定要指定,max_length的值

	title = models.CharField(max_length=200)

如果字符串的长度超过254就不建议使用CharField了,而使用TextField

#EmailField
弄到数据库时和CharField是一样的
在数据库层面不会限制字符串要满足什么格式
只是以后在使用ModelForm等表单相关操作的时候会起作用
email = models.EmailField()

#FloatField

#IntegerField
-int ~ +int

#DateField,DateTimeField,TimeField

外键和表关系

from django.db import models

class Category(models.Model):
	name = models.CharField(max_length=100)

class Article(models.Model):
	title = models.CharField(max_length=100)
	content = models.TextField()
	# 这个是指当我Categorie这张表变的时候,会跟进Article这张表的改变
	# 即cartegory变article会变
	category = models.ForeignKey('Category',on_delete=models.CASCADE)# 级联删除

#应用
views.py里面

from django.shortcuts import render
from .models import Category,Article
from django.http import HttpResponse

def index(request):
	category = Category(name="热门文章")# 实例化
	category.save()# 注意一定要先save一下
	article = Article(title='abc',content='1234')
	article.category = category
	article.save()

整个过程就是:

1.创建一个app,根据app的需求,功能,模块在app对应的models.py定义对应的类
2.配置settings里面的数据库,app,然后cmd把app的模型映射到数据库里面
3.在这个app的视图函数中导入models里面的类,实例化这些类分析他们之间的关系并操作他们

思考

article = Article.objects.first()
Article就是表,Article.objects就是一行,Article.objects.first()就是一个字段

如果需要在这个app的models中使用别的app里面的模型

比如是一个新的app叫frontuser,下面的FrontUser这个类
只需要在models.ForeignKey(“app名.类名”)即可

代码:
frontuser app下的models.py

from django.db import models

class Frontuser(models.Model):
	username = models.CharField(max_length=100)

article app下的models.py

from django.db import models

class Category(models.Model):
	name = models.CharField(max_length=100)

class Article(models.Model):
	title = models.CharField(max_length=100)
	content = models.TextField()
	category = models.ForeignKey('Category',on_delete=models.CASCADE)
	# 为何null=True呢,因为之前Article这张表的这些值肯定是不存在的,如果不指定为空
	# 那么就要存在这个字段并有初始值才行
	author = models.ForeignKey('frontuser.Frontuser',on_delete=models.CASCADE,null=True)

实现多级评论,即这个评论是根据上面那个评论进行评论的(Comment模型引用自身)

就是说引用的模型是自己

from django.db import models

class Comment(models.Model):
	content = models.TextField()
	orgin_comment = models.ForeignKey('self',on_delete=models.CASCADE)
	# 或者 orgin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE)
	# 或者 orgin_comment = models.ForeignKey('Article.Comment',on_delete=models.CASCADE)

学习Django时,使用PyCharm作为开发工具可以提高效率。PyCharm是一款功能强大的Python集成开发环境,它提供了丰富的功能和工具,可以帮助开发者更好地编写和调试Django应用程序。 在学习Django的过程中,可以使用PyCharm创建Django项目,并使用其内置的Django支持功能来简化开发过程。PyCharm可以自动识别Django项目的结构,并提供代码补全、语法检查、调试等功能,帮助开发者更快地编写和调试代码。 此外,PyCharm还提供了集成的版本控制系统,如Git,可以方便地管理和追踪代码的变化。它还支持自动化测试和部署,可以帮助开发者更好地进行项目管理和发布。 总之,使用PyCharm作为开发工具可以提高Django学习的效率和便利性。它的强大功能和友好的用户界面使得开发者可以更专注于代码的编写和项目的开发。\[1\] \[2\] \[3\] #### 引用[.reference_title] - *1* *3* [PyCharm平台下初学Django框架](https://blog.csdn.net/howard2005/article/details/93491364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [pycharm平台下的Django教程](https://blog.csdn.net/Sunshine_ZCC/article/details/73918408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值