zoukankan      html  css  js  c++  java
  • 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:pymydjingoorm1021>python manage.py makemigrations
    Migrations for 'demo1':
      demo1migrations001_initial.py
        - Create model Book
    (djingo-env) D:pymydjingoorm1021>python manage.py makemigrations
    No changes detected
    View Code
    • migrate  使用migrate将新生成的迁移脚本映射到数据库中.
      如果是第一次,INSTALLED_APPS中注册的应用都会创建表.
      没指定表名,默认以app名为前缀加类名

    (djingo-env) D:pymydjingoorm1021>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
  • 相关阅读:
    PyQt QFontDialog显示中文
    zetcode :: First programs in PyQt5
    PyQt4 初试牛刀二
    PyQt5实现透明电子时钟
    配置web.xml和glassfish容器实现javaEE表单验证
    nodejs querystring踩坑笔记----只能用于表单提交
    使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制
    CAS单点登录(SSO)服务端的部署和配置---连接MySQL进行身份认证
    Oracle中碰到的函数和关键字收集
    windows系统局域网内开启远程桌面图解
  • 原文地址:https://www.cnblogs.com/wdee/p/9827307.html
Copyright © 2011-2022 走看看