创建django项目

在pycharm中创建django项目时,同时生成新的虚拟环境,选择相应的python版本。创建完后在,可以查看当前的django版本,和已经安装的模块。
image.png
目录说明:

  • djangodemo: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
  • settings.py: 该 Django 项目的设置/配置。
  • urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站”目录”。
  • wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

    运行项目

    进入项目的根目录,在终端中运行

    python3 manage.py runserver

默认IP:127.0.0.1,默认端口:8000,弱国需要修改可以在runserve后面直接跟上IP空格端口号。
在浏览器输入:127.0.0.1:8000就可以进入django的主页。

创建app

django中使用app来划分功能模块,一个app是一个python包,通过命令来生成app:

python manage.py startapp djangodemo(app名)

image.png
app目录:
migrations:用来存放数据库迁移文件,数据库表的修改会记录在这个包中。
admin.py:后台管理类
apps.py:app类
models.py:模型类,用来与数据库做ORM映射和进行数据库的操作。
views.py:试图函数,逻辑处理
app生成后需要在项目中激活,在项目目录djangodemo中的setting配置文件的INSTALLED_APPS中添加应用:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'cruddemo', # 激活应用
  9. ]

配置数据库

django默认数据库是sqllite,使用MySQL时需要在项目目录djangodemo中修改setting配置文件DATABASES。
配置如下:

  1. DATABASES = {
  2. 'default': {
  3. #'ENGINE': 'django.db.backends.sqlite3',
  4. #'NAME': BASE_DIR / 'db.sqlite3',
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME': 'djangodemo', # 数据库名
  7. 'USER': 'root', # 用户名
  8. 'PASSWORD': '123456', # 密码
  9. 'HOST': '127.0.0.1',
  10. 'PORT': '3306',
  11. }
  12. }

另外在项目目录djangodemo中的init.py文件中导入pymysql

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

创建模型类

在curddemo应用的model.py文件中定义模型类,需要继承Model类,Model类中有对象操作的方法,可以直接与数据库交互。

  1. from django.db import models
  2. import datetime
  3. class book(models.Model):
  4. """book model"""
  5. id = models.AutoField(primary_key=True)
  6. book_name = models.CharField(max_length=50)
  7. pub_data = models.DateField()

数据表迁移

生成数据表迁移文件,在终端执行命令:

python manage.py makemigrations app_name #不加app_name时为全局生成

执行迁移,在数据库生成模型相应的表,终端执行命令:

python manage.py migrate app_name #不加app_name时为全局生成

迁移完成后可以在数据库查看生成的表。

crud操作

在终端执行 python manage.py shell 命令进入命令行模式,在命令行模式导入模型类后可以使用命令行模式来对数据库进行crud操作。

  1. >>> from cruddemo.models import book
  2. >>> import datetime
  3. >>> b = book()
  4. >>> b.book_name = 'java'
  5. >>> b.pub_data = datetime.date(2019,10,3)
  6. >>> b.save() #保存数据到数据库
  7. >>> res = book.objects.all() #查询所有记录
  8. >>> print(res)
  9. <QuerySet [<book: book object (1)>, <book: book object (2)>]> #手动在数据库中添加了一条数据
  10. >>> print(book.objects.get(id=2))
  11. book object (2)
  12. >>> b2 = book.objects.get(id=2) #根据id来查记录
  13. >>> type(b2)
  14. <class 'cruddemo.models.book'>
  15. >>> b2.book_name
  16. 'java'
  17. >>> b2.pub_data
  18. datetime.date(2019, 10, 3)
  19. >>> b2.delete() #删除记录
  20. (1, {'cruddemo.book': 1})
  21. >>> print(book.objects.all())
  22. <QuerySet [<book: book object (1)>]>
  23. >>> b.book_name = 'python web'
  24. >>> b.save()
  25. >>> print(book.objects.get(id=1).book_name)
  26. python
  27. >>> upb2 = book.objects.get(id=2)
  28. >>> print(upb2.book_name)
  29. python web
  30. >>> upb2.book_name = 'django'
  31. >>> upb2.save() #修改记录的值
  32. >>> print(book.objects.get(id=2).book_name)
  33. django

关联查询

有book和author两个关联表,book的主键关联author的外键。

  1. from django.db import models
  2. import datetime
  3. # Create your models here.
  4. class book(models.Model):
  5. """book model"""
  6. id = models.AutoField(primary_key=True)
  7. book_name = models.CharField(max_length=50)
  8. pub_data = models.DateField()
  9. class author(models.Model):
  10. """author model"""
  11. id = models.AutoField(primary_key=True)
  12. name = models.CharField(max_length=50)
  13. comment = models.CharField(max_length=128)
  14. # 外键的关联字段
  15. hbook = models.ForeignKey(to='book',on_delete=models.PROTECT)

to:为关联的对象名
on_delete:jango2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题。
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

  • CASCADE:此值设置,是级联删除。
  • PROTECT:此值设置,是会报完整性错误。
  • SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
  • SET_DEFAULT:此值设置,会把设置为外键的默认值。
  • SET():此值设置,会调用外面的值,可以是一个函数。

一般情况下使用CASCADE就可以了。
models.py修改后按照表迁移的操作,将表更新到数据库中。

  1. >>> from cruddemo.models import book,author
  2. >>> import datetime
  3. >>> b = book.objects.get(id=1)
  4. >>> a = author()
  5. >>> a.name = 'orange'
  6. >>> a.comment = 'python small white'
  7. >>> a.hbook = b #外键字段使用关联对象来赋值
  8. >>> a.save()
  9. >>> print(author.objects.all())
  10. <QuerySet [<author: author object (1)>]>
  11. >>> b = author()
  12. >>> b.name = 'apple'
  13. >>> b.comment = 'good at python'
  14. >>> b.hbook = book.objects.get(id=1)
  15. >>> b.save()
  16. >>> author.objects.all()
  17. <QuerySet [<author: author object (1)>, <author: author object (2)>]>
  18. >>> fb = book.objects.get(id=1)
  19. >>> fb.author_set.all() #关联查询
  20. <QuerySet [<author: author object (1)>, <author: author object (2)>]>
  21. >>> for a in fb.author_set.all():
  22. ... print(a.name)
  23. ...
  24. orange
  25. apple