Django的项目的app创建与ORM(Object-relational mapping)的使用

妖精的绣舞 提交于 2020-12-03 22:46:05
Django项目app  --> 项目中又分了一级Python包,不同的功能放到不同的包里面
        1. 创建app        
python manage.py startapp app01
创建app
        2. 告诉Django创建了一个app         
INSTALLED_APPS = [
    'app01.apps.App01Config',  # 告诉Django我自己新建了一个名叫app01的应用
    # 'app01'
]
在settings.py找那个的INSTALLED_APPS中添加新创建的app
 
ORM是Django用来操作数据库的一种框架
其中ORM与数据库的对应关系是:
   
ORM DB
数据表
属性 字段
对象 数据行
    
 
  
 
 
 
Django中ORM的使用
1. 用处
1. 操作数据表
2. 操作数据行                       
 2. 使用
     1. 手动创建一个数据库
create database mysite;
mysql中创建数据库
      2. 告诉Django连哪个数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 连接数据库的类型
        'NAME': 'mysite',  # 数据库名
        'HOST': '127.0.0.1',  # 数据库主机地址
        'PORT': 3306,  # 数据库的端口
        'USER': 'root',
        'PASSWORD': '',
    }
}
在ssetting中设置数据库配置
3. 用什么连数据库?
         利用第三方的包,比如第三方包:pymysql和MySQLdb
         告诉Django用pymysql模块代替默认的MySQLdb去连接MySQL数据库
         和settings.py同级的__init__.py文件,写上:
import pymysql
    pymysql.install_as_MySQLdb()
和setting同级的__init__文件中写上

 

4. 在app/models.py的文件中创建类
         类必须继承models.Model
class Press(models.Model):
    id = models.AutoField(primary_key=True)  # id主键
    name = models.CharField(max_length=32)  # 出版社名称

    def __str__(self):
        return '<这是一个出版社对象,它的名字是:{}>'.format(self.name)


#
class Book(models.Model):
    id = models.AutoField(primary_key=True)  # 自增id主键
    title = models.CharField(max_length=30)  # 书名
    price = models.IntegerField()  # 价格
    # Django 1.11 默认就是级联删除, Django 2.0之后必须指定on_delete
    # to=关联的表名
    press = models.ForeignKey('Press', on_delete=models.CASCADE)


# 作者
class Author(models.Model):
    id = models.AutoField(primary_key=True)  # 自增id主键
    name = models.CharField(max_length=32)  # 作者名字
    books = models.ManyToManyField(to='Book')  # 只是ORM层面建立的一个多对多关系,不是作者表的一个字段

    def __str__(self):
        return self.name
类的创建与字段的定义

 

5. 执行命令
1. python manage.py makemigrations   --> 找个小本本把models.py的变更记录一下
2. python manage.py migrate          --> 把上面的变更记录翻译成SQL语句,去数据库执行
执行修改
        
6. ORM操作
from app01.models import User, Press, Book, Author
先导入
Press.objects.all()   # 查询所有出版社对象   ——》 对象列表   queryset
    Press.objects.filter(条件)  # 查询所有满足条件的出版社对象   ——》 对象列表   queryset
    Press.objects.get(条件)     # 查询有且只能有一个对象   没有或者多个都报错  ——》 对象
    
    属性:
        press_obj.id 
        press_obj.name 
    
    
    外键:
        book_obj.id
        book_obj.title
        book_obj.press        ——》 关联的对象 
        book_obj.press_id     ——》 数据库中的关联对象的ID 
        book_obj.press.id  
        
    多对多:
        author_obj.books     ——》 管理对象
        author_obj.books.all()     ——》作者关联的所有书籍对象 
new_obj = Press.objects.create(name='新的出版社')   
    
    Book.objects.create(title='书名',price=15,press=press_obj)
    Book.objects.create(title='书名',price=15,press_id=press_obj.id)
    
    new_obj= Author.objects.create(name='作者名')
    new_obj.books.set([1,2,3])
    new_obj.books.set([book1,book2])
    
    new_obj.books.add(1,2,3)
press_obj.name = '新的出版社名字'
    press_obj.save()
    
    book_obj.press = press_obj
    # book_obj.press_id = press_obj.id
    book_obj.save()
    
    
    
    author_obj.name = '作者名'
    author_obj.save()
    
    author_obj.books.set([1,2,3])
    book_obj.delete()        —— 》 删除单个对象
    
    Press.objects.filter(条件).delete()   ——》 删多个对象

 

 
 
 
7.其中有个用Pycharm连接数据库的技巧,其实也只需要配置好就可以使用了的。
最好时区这里填上,有时候会发生时区错误。
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!