django的ORM
ORM模型
orm,object relational mapping
-
创建项目
创建app
workon djingo-env #django-admin.py startproject orm_demo #pycharm创建,或者其他工具创建 python manage.py startapp demo1
- 注册app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'demo1', ]
- 配置数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django1', 'USER':'root', 'PASSWORD':'123456', 'HOST':'127.0.0.1', 'PORT':3306, } }
- 创建模型
from django.db import models #注意父类要设置为models.Model或他的子类 class Book(models.Model): #id int name varchar(100) author varchar(100) price float #id字段可不写,默认会生成 id = models.AutoField(primary_key=True) name = models.CharField(max_length=100,null=False) author = models.CharField(max_length=100,null=False) price = models.FloatField(null=False,default=0)
- makemigrations 使用makemigrations生成迁移脚本文件.没有更新的话就是No changes detected
(djingo-env) D:\py\mydjingo\orm1021>python manage.py makemigrations Migrations for 'demo1': demo1\migrations\0001_initial.py - Create model Book (djingo-env) D:\py\mydjingo\orm1021>python manage.py makemigrations No changes detected
-
migrate 使用migrate将新生成的迁移脚本映射到数据库中.
如果是第一次,INSTALLED_APPS中注册的应用都会创建表.
没指定表名,默认以app名为前缀加类名
(djingo-env) D:\py\mydjingo\orm1021>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, demo1, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying demo1.0001_initial... OK Applying sessions.0001_initial... OK mysql> show tables; +----------------------------+ | Tables_in_django1 | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | demo1_book | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+
- orm操作
-
增
创建表对象,save()
查
查询都是用Table.objects对象操作
Table.objects.get(pk=1)通过主键
Table.objects.filter(name='aa')通过其它字段,返回 QuerySet 对象
Table.objects.first()返回一个对象 Table.objects.all()返回 QuerySet 对象
删
先查询,然后.delete()
改
先查询,修改对象属性,save()
from django.http import HttpResponse from .models import Book1 def index(request): #添加一条记录 # book = Book1(name='西游记',author='吴承恩',price=169) # book.save() #查询 Book1.objects. #1根据主键查询返回一条数据 # book = Book1.objects.get(pk=1) #2根据其它条件查找,返回 QuerySet 对象 .first()返回一个对象 # books = Book1.objects.filter(name='西游记').first() # print(books) #删除数据 # book = Book1.objects.get(pk=1) # book.delete() #修改数据 #book = Book1.objects.get(pk=2) #book.price = 55 #book.save() return HttpResponse('成功了')
- 数据库字段常用类型
models.BigAutoField(primary_key=True) bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY models.BooleanField() tinyint(1) NOT NULL models.NullBooleanField() tinyint(1) DEFAULT NULL models.EmailField() varchar(254) varchar最大字符长度254个字符,底层数据库中是varchar类型ModelForm表单验证时使用 models.CharField(max_length=254) varchar(254) max_length必须指定 models.TextField(null=True) longtext models.DateField(auto_now_add=True) date NOT NULL 创建时间 python中datetime.date,在sql为date models.DateField(auto_now=True) 修改时间 models.DateTimeField() datetime 数据库中datetime, models.TimeField() time 数据库中time,在python中datetime.time类型
- 一对多 外键
-
#models.ForeignKey('Table',on_delete=models.CASCADE,related_name='tablename')
# 1 引用外键表,引号加类名(表名).
# 其它app的表加app.table.引用自身也可用self
# 2 必须要有on_delete= ,级联删除的选项models.CASCADE
# 3 related_name=articles,一对多的参数,默认为table_set,related_name=article_set
cascade
protect
set_null
set_default
set()
do_nothing
from django.db import models table_set,related_name=article_set class Category(models.Model): name = models.CharField(max_length=100) def __str__(self): return "<category>" class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() category = models.ForeignKey("Category",on_delete=models.CASCADE,related_name='articles') user = models.ForeignKey("frontuser.User",on_delete=models.CASCADE,null=True) def __str__(self): return "<article:%s,%s,%s>" %(self.title,self.content,self.category) class Comment(models.Model): content = models.TextField() # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE) origin_comment = models.ForeignKey('self', on_delete=models.CASCADE)
- 添加的两种方法
def index(request): category = Category(name='新闻') category.save() article = Article(title='python',content="python....") article.category = category article.save() return HttpResponse('sucess') def index1(request): category = Category.objects.first() artcile = Article(title='php',content='php....') category.articles.add(artcile,bulk=False) return HttpResponse('sucess1')