一.定义与使用模型
这是大概的步骤:
1.一般是和mysql数据库连接,所以需要注意:
在项目中的settings.py文件中配置参数如下:
连接数据库
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME':"test",
'HOST':"127.0.0.1",
'POST':"3306",
'USER':"root",
'PASSWORD':"123456",
}
}
2.在子应用中的models.py文件中模型类中创建。
from django.db import models
# Create your models here.
#一个class类对应一张表
class Classes(models.Model):
#字段来描述列
ClassesName=models.CharField(max_length=30) #varchar(30)
class Students(models.Model):
StuName=models.CharField(max_length=20)
StuAge=models.IntegerField(null=True) #默认null是False 表示不能为空
StuSex=models.BooleanField() #d布尔字段,表示0或1
#外键列
myclass=models.ForeignKey(Classes,on_delete=models.CASCADE)
3.有数据库的在子应用中的models.py文件中模型类中创建(依据数据库来创建)
from django.db import models
# Create your models here.
#一个class类对应一张表
class Users(models.Model):
class Meta: #描述元数据的内部类
db_table="users" #描述数据库中的表名
#字段来描述列
id=models.AutoField(primary_key=True,db_column="id")
username=models.CharField(max_length=30)
email=models.CharField(max_length=50,null=True)
password=models.CharField(max_length=30, null=True)
def __str__(self): #魔法函数,用于打印对象时,显示对象中的某个信息
return self.email
class Articles(models.Model):
class Meta:
db_table="articles"
id=models.AutoField(primary_key=True,db_column="id")
title=models.CharField(max_length=50,null=True) #默认null是False 表示不能为空
content=models.TextField()
create_date=models.DateTimeField(null=True,auto_now_add=True)
user_id=models.ForeignKey(Users,on_delete=models.CASCADE,db_column="user_id")
def __str__(self):
return self.title
注意此时会报错!错误信息为有一个err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
所以需要装mysqlclient 模块!
pip install mysqlclient
必须进入到项目地下
cd 项目名
执行下面命令:
pip install mysqlclient
注意:如果有数据不再执行以下命令!
生成迁移文件
python manage.py makemigrations
执行迁移文件
python manage.py migrate
python manage.py shell
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from hello.models import *
>>> c=Classes()
>>> c.ClassesName="大数据2001"
>>> c.save() *添加*
>>> c1=Classes(ClassesName="大数据2010")
>>> c1.save()
>>>s1=Students(StuName='jack',StuAge=25,StuSex=False,myclass=c1)
>>> s1.save()
>>>c1.ClassesName='大数据0001'
>>>c1.save() *修改*
>>> s1.StuSex=True
>>> s1.myclass=Classes.objects.get(id=1)
>>> s1.save()
>>> stu=Students.objects.all()
>>> stu
<QuerySet [<Students: Students object (1)>]>
>>> stu[0]
<Students: Students object (1)>
>>> stu[0].myclass.ClassesName
'大数据2013'
>>> c1.students_set.all()
<QuerySet []>
查询
查询id大于20的笔记
>>> Articles.objects.filter(id__gt=20)
[, , .txt>, -笔记.txt>, .txt>]>
查询id是1,10,20的笔记
>>> Articles.objects.filter(id__in=[1,10,20,])
[, , ]>
查询日期在2021-04-07到2021-04-12的笔记
>>> Articles.objects.filter(create_date__range=['2021-04-07','2021-04-12'])
[, , , (
增读改删)操作>]>
查询以java开头的笔记
>>> Articles.objects.filter(title__startswith='java')
[.txt>, , , , , , , ]>
查询以语法结尾的笔记
>>> Articles.objects.filter(title__endswith='语法')
[]>
查询2022年的笔记
>>> Articles.objects.filter(create_date__startswith='2022')
[]>
note=Articles.objects.get(id=1)
note.user_id.username
u=Users.objects.get(id=1)
u.articles_set.all()
查询作者是admin的所有笔记
>>> u=Users.objects.get(username='admin')
>>> u
.com>
>>> u.articles_set.all()
[, ]>
查询不是’人间四月天‘的其他笔记\
>>> Articles.objects.exclude(title='人间四月天')
[, , , ,
(增读改删)操作>, , .txt>, , , <
Articles: java-类的定义>, , , , , , , .txt>, -笔记.txt>, .txt>]
>
Q对象
查看以java开头并且以定义结尾的笔记
>>> Articles.objects.filter(Q(title__startswith='java')&Q(title__endswith='定义'))
[]>
查看包含java或包含python的笔记
>>> Articles.objects.filter(Q(title__contains='java')|Q(title__contains='python'))
[.txt>, , , , , , , , ]>
执行原生的SQL语句
1.raw()方法
>>> a=Articles.objects.raw("select id,title from articles where title like %s",["%"+"java"+"%"])
>>> a
select id,title from articles where title like %java%>
>>> a[0]
.txt>
2.利用游标对象执行SQL语句
>>> from django.db import connection
>>> c=connection.cursor()
>>> c.execute("select * from articles limit 0,5")
5
>>> c.fetchall()