Django的Web框架是可以用来开发交互式网站的工具,它能够响应网页请求,更轻松的读写数据库、管理用户等。
1. 在Django中创建项目:
django-admin startproject 项目名 .
命令行最后的句点一定带上,否则部署应用程序时将遭遇一些配置问题。如果忘记使用句点,可以将创建的文件和文件夹删除重新运行
2. 创建数据库:
python manage.py migrate
我们将修改数据库成为迁移数据库,后面如果对数据库中的模型进行修改后,也要执行迁移操作。
执行python manage.py runserver
此时就可以打开http://127.0.0.1:8000查看项目是否成功展示了页面
3. 创建应用程序:
python manage.py startapp 应用名
该命令创建应用程序所需的基础设施 ,新增应用名同名的文件夹,其中包含models.py、 admin.py和views.py 。
4. 定义模型:
打开models.py 在其中创建自己的模型
1 from django.db import models 2 3 # Create your models here. 4 5 6 class Pizza(models.Model): 7 """定义Pizza模型""" 8 name = models.CharField(max_length=200) 9 date_added = models.DateTimeField(auto_now_add=True) 10 11 def __str__(self): 12 """返回模型的字符串表示""" 13 return self.name 14 15 16 class Topping(models.Model): 17 """定义Topping模型""" 18 pizza = models.ForeignKey(Pizza, on_delete=models.DO_NOTHING) 19 name = models.TextField() 20 date_added = models.DateTimeField(auto_now_add=True) 21 22 def __str__(self): 23 """返回模型的字符串表示""" 24 return self.name
5. 激活模型:
要使用模型,必须让Django将应用程序包含到项目中。打开settings.py,在INSTALLED_APPS下添加自己的应用名。
- 接下来要让Django修改数据库,使其能够存储模型相关的信息。
python manage.py makemigrations 应用名
命令makemigrations让Django去欸的那个该如何修改数据库,存储与我们新定义的模型相关联的数据。
输入表明Django创建了一个名为0001——initial.py的迁移文件,这个而文件在数据库中为模型创建一个表。
- 然后用这个迁移进行修改(创建过的)数据库
python manage.py migrate
这个命令上面执行过,第一次执行为创建数据库,后面再执行的时候就是修改
6. 管理网站
- 创建超级用户
python manage.py createsuperuser
- 向管理网站注册模型
修改admin.py
1 from django.contrib import admin 2 3 # Register your models here. 4 from pizzas.models import Pizza, Topping 5 6 admin.site.register(Pizza) 7 admin.site.register(Topping)
此时访问http://127.0.0.1:8000/admin/时,就可以使用超级管理员,来进行数据修改了
过程中遇到的问题
1.
python manage.py makemigrations learning_logs
在models.py中创建了两个数据库表模型,第二个表引用第一个表的id作为外键,
topic = models.ForeignKey(Topic)
修改数据库模型时提示报错:
报错内容:
File "C:Userschenhao.jialearning_logsmodels.py", line 14, in <module> class Entry(models.Model):
File "C:Userschenhao.jialearning_logsmodels.py", line 16, in Entry topic = models.ForeignKey(Topic)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
分析:
看报错提示是因为在topic = models.ForeignKey(Topic)中少了一个参数,
在这行关联语句中加入on_delete=models.DO_NOTHING
原因如下:
django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError: init() missing 1 required positional argument:
‘on_delete’
on_delete各个参数的含义如下:
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,
# 删除关联数据,
2.
增加完on_delete参数之后,再次修改模型时提示:
You are trying to add a non-nullable field 'topic' to entry without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
原因分析:
因为之前数据库中已经有数据了,现在加了一个字段,如果这个字段没有默认值,它不知道该填什么,所以会报错
因此只要先给他一个任意的默认值(数据类型要能对应上),然后python manage.py makemigrations XXX修改数据库,再python manage.py migrate迁移数据库。
再将default删去,再次修改数据库-迁移数据库就OK了。
——————待续——————