django的ORM

ORM模型
orm,object relational mapping

  • 创建项目
    创建app

workon djingo-env
#django-admin.py startproject orm_demo
#pycharm创建,或者其他工具创建
python manage.py startapp demo1
View Code
  • 注册app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'demo1',
]
View Code
  • 配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django1',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'127.0.0.1',
        'PORT':3306,
    }
}
View Code
  • 创建模型
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)
View Code
  • 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
View Code
  • 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             |
+----------------------------+
View Code
  • 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('成功了')
View Code

 

  • 数据库字段常用类型
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类型
View Code

 

  • 一对多 外键
  • #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
View Code
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)
View Code

 

  •  添加的两种方法
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')
View Code

 

posted @ 2018-10-21 22:16  来看看博客  阅读(130)  评论(0编辑  收藏  举报