zoukankan      html  css  js  c++  java
  • Python学习---django之ORM语法[对象关系映射]180124

    ORM语法[对象关系映射]

    ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作。

    优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发。

             2 可以避免一些新手程序猿写sql语句带来的性能问题。

    缺点:1  性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。

             2  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

             3  通过QuerySet的query属性查询对应操作的sql语句

                  author_obj=models.Author.objects.filter(id=2)

                  print(author_obj.query)

    创建表[class类创建表]:

    一对一: OnetoOne

    一对多: ForeignKey[外键在多的那个类/表中]

    多对多: Manytomany

    ORM操作

    创建表[class类创建表]:
        一对一: OnetoOne
        一对多: ForeignKey[外键在多的那个类/表中]
        多对多: Manytomany
    操作表[行对象]:
        增:
            create: 
                单表增加1
                        models.Book.objects.create(name='FTL')
                单表增加2【推荐】
                        dict={'name':'FTL'}
                             models.Book.objects.create(**dict)  # 接收传递过来的字典
                一对多表增加1【外键publish】
                        models.Book.objects.create(name='FTL', publish_id=2) # 直接添加id
                一对多表增加2【外键publish,推荐根据对象添加】
                        publisher=models.Publish.objects.get(id=2)
                        # 添加单个对象,非集合【否则就变成了多对多】
                        models.Book.objects.create(name='FTL', publish=publisher)
                   多对多【推荐对象添加】
                        publisher=models.Publish.objects.get(id=2)
                        publisher1=models.Publish.objects.get(id=3)
                        book=models.Book.objects.get(id=2)
                        book.add(publish,publish1)
                        或者方向添加: author.book_setadd(*books) [books是列表]
            save:
                单表创建1、book = Book(name='FTL')
                              book.save();
                单表创建2、book = Book()
                              obj.name='FTL'
                              ojb.save()
                   多表创建同上create()
       删: delete, remove, clear
        改: update, save
        查:filter, get

    创建表模型:

    /blog/models.py

    # --------------------------------ORM学习------------------------
    from django.db import models
    class Publish(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField('名称', max_length=64)
        city = models.CharField('所在城市', max_length=64)
        province = models.CharField('省份', max_length=30, default='BJ')
        country = models.CharField('国家', max_length=33, default='CHINA')
        website = models.CharField('网址', max_length=30, default="WWW")
        class Meta:
            verbose_name='出版社'
            verbose_name_plural = verbose_name  # plural 复数的
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name = models.CharField('姓名', max_length=30)
        def __str__(self):
            return self.name
    
    class AuthorDetail(models.Model):
        sex = models.BooleanField(max_length=1, choices=((0, '男'), (1, '女')))
        email = models.EmailField('邮箱', max_length=12)
        birthday = models.DateField()
        author = models.OneToOneField(Author,on_delete=models.CASCADE,)
    
    class Book(models.Model):
        title = models.CharField(max_length=64, verbose_name="标题")
        price = models.DecimalField(max_digits=5, decimal_places=2, default=10)
        page_num = models.IntegerField(null=True,editable=False) # Djangog默认可修改
        # 注意是添加了引号的类,如果不添加,则需要把类放在该类的前面[否则Py解释器找不到]
        author = models.ManyToManyField('Author', default='FTL')     # 1本书有多个作者
        # author = models.ManyToManyField(Author, default='FTL')     # Author类必须在Book之前
        #外键属性,django在创建表单时候会默认将publish改为publish_id[外键在多的那一方创建]
        publish = models.ForeignKey('Publish', on_delete=models.CASCADE, default=1,)
        publish_date = models.DateField(default='2020-20-20')
        def __str__(self):
            return self.title

    执行命令,创建表单:

    python manage.py makemigrations  # 会在blog下migrations文件夹下生成一个Python文件
                                           # F:Djangomysite2logmigrationsauto_20180125_0737.py
    pytyon manage.py migrate         # 真正去数据库里面创建表 
    

    建表成功:

    image

    分析代码:
      <1>  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。
      <2>  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。
      <3>  模型之间的三种关系:一对一,一对多,多对多。
    一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
    一对多:就是主外键关系;(foreign key)
    多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)

    问题解决

    遇到的问题1:

    问题现象:表字段无默认值报错,建表失败

    image

    问题解决: 添加属性默认值,Py3新增加

    遇到的问题2:

    问题现象:外键没有设置级联删除,建表失败

    image

    问题解决: 添加级联删除,on_delete=models.CASCADE,

  • 相关阅读:
    window.location.Reload()和window.location.href 区别
    PHP substr(),mb_substr()及mb_strcut的区别和用法
    jstree节点展开设置
    关于Jquery中ajax方法data参数用法
    HTML相对路径(Relative Path)和绝对路径(Absolute Path)
    Win32基础编程了解窗口类
    Visual C++ ActiveX 开发指南:第一章 什么是ActiveX
    分粥
    蛙蛙推荐:ASP实现自定义标签模板
    蛙蛙请教:如何利用委托实现多个方法同时调用.
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9399241.html
Copyright © 2011-2022 走看看