3、Django模型与数据库
3.1 Django模型与MySQL数据库
Django应用程序默认配置的是SQLite,如果要使用其他数据库则需要修改settings.py文件中的DATABASES。如果使用MySQL数据库,采用PyMySQL驱动,需要先修改setting.py文件中的DATABASES,修改如下:
其中,OPTIONS可有可无。这是连接已经存在的数据库:房屋租赁系统的方法。然后进入和setting.py同一文件夹下的__init__.py文件中添加以下代码:
此过程可能会因为数据库版本过低和django不兼容的情况,我采用的是django4.2和mysql8.0.33才解决掉不兼容的情况。然后删掉db.sqlite3:
3.2Django创建模型
在models.py文件中定义模型类。你需要根据自己的业务需求定义模型类,并且在模型类中定义字段、关联关系等信息。
当我们第一次在models.py中创建类对象还是对类中的属性进行修改,我们都会使用python manage.py makemigrations 和 python manage.py migrate 两个命令
python manage.py makemigrations这个命令是记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件。例如:0001文件,如果你接下来还要进行改动的话可能生成就是另外一个文件不一定都是0001文件,但是这个命令并没有作用到数据库。
而当我们执行python manage.py migrate 命令时 这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性
另外一个需要注意的是这两个命令默认情况下是作用于全局,也就是对所有最新更改的models或者migrations下面的迁移文件进行对应的操作,如果要想仅仅对部分app进行作用的话 则执行如下命令:
python manage.py makemigrations appname,
python manage.py migrate appname,
如果要想精确到某一个迁移文件则可以使用:
python manage.py migrate appname 文件名
3.3Django模型的存放
在Django项目中,将所有模型放在一个models.py文件中或者将每个模型放在各自的APP下的 models.py文件中都是可以的,具体取决于项目的规模和结构。
如果项目比较小,只有几个模型,那么将所有模型放在一个models.py文件中是比较方便的。这样可以避免创建过多的文件,也方便查找和管理模型。
如果项目比较大,有多个 APP,每个 APP都有自己的模型,那么将每个模型放在各自的APP下的models.py文件中是比较合适的。这样可以将模型与APP相关联,方便查找和管理,也方便将APP作为独立的组件进行开发和维护。
视图函数与HTML文件、CSS文件的存放方式和模型的存放一样,取决于项目规模的大小。
无论是将所有模型放在一个models.py文件中还是将每个模型放在各自的APP 下的models.py文件中,都需要在settings.py 文件中将APP加入到INSTALLED_APPS中,例如:
INSTALLED_APPS = [
'myapp1',
'myapp2',
...
]
在上面的例子中,将myapp1和myapp2加入到INSTALLED_APPS 中,表示这两个APP中的模型会被Django 加载和管理。
3.4 DjangoAPP的两种配置方法
在Django项目中,将APP加入到INSTALLED_APPS 中可以让Django加载和管理该APP中的模型、视图、模板等组件。在INSTALLED_APPS中写入APP的方式有两种:
1.直接写入APP名称,例如:
INSTALLED_APPS = [
'test1',
...
]
在上面的例子中,将test1加入到INSTALLED_APPS中,表示Django 会加载和管理test1中的组件。
2.写入APP的配置类,例如:
INSTALLED_APPS = [
'test1.apps.Test1Config',
...
]
在上面的例子中,将test1.apps.Test1Config 加入到INSTALLED_APPS中,表示Django会加载和管理test1中的组件,,并使用Test1Config类来配置该APP。
这两种方式的区别在于,直接写入APP名称时,Django 会默认使用该APP中的AppConfig类来配置该APP;而写入APP的配置类时,可以自定义AppConfig类来配置该APP。
如果同时将APP名称和配置类都写入INSTALLED_APPS中,会导致冲突,Django只会使用其中一种方式来加载和管理该APP中的组件。因此,建议只使用一种方式来将APP加入到INSTALLED_APPS中。
3.5 Django连接多个数据库
在Django 中连接多个MySQL数据库,可以通过在settings.py文件中配置DATABASES参数来实现。具体步骤如下:
1.在settings.py 文件中添加DATABASES参数,例如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'default_db',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
},
'second_db': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'second_db',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '3306',
}
}
在上面的例子中,定义了两个 MySQL数据库,一个是默认的default_db,另一个是second_db.
2.在模型类中指定连接的数据库,例如:
class MyModel1(models.Model):
name = models.CharField(max_length=50)
class Meta:
db_table = 'my_table'
app_label = 'myapp'
managed = False
using = 'second_db'
在上面的例子中,MyModel1指定了连接second_db数据库。
3.在视图函数中使用指定的数据库,例如;
from django.db import connections
def my_view(request):
with connections['second_db'].cursor() as cursor:
cursor.execute('SELECT * FROM my_table')
rows = cursor.fetchall()
return HttpResponse(rows)
在上面的例子中,使用connections[second_db]获取second_db数据库的连接,并使用cursor()方法获取游标,然后执行SQL查询。