• ORM(一)


    ORM常识:

    1、一对多,多的一方设置外键字段,有外键字段的表叫做子表。没有外键字段的表叫做主表。

    2、主表放到子表的下面,否则子表找不到主表,写数据要先往主表中写。

    数据库:(1)不创建主键,会自动添加主键。

    (2)创建的外键会自动添加后缀“_id”

    练习题:

    1、一对多、一对一

    创建一个book表,有title和price字段

    创建一个publish表,有name和addr字段

    建立book和publish之间一对多的关系

    用save和create的方法给publish表添加两条数据。

    给book表添加两条数据:金瓶眉、23、出版社2;水浒传、34、出版社2 。 ||| (有save方法和create方法/知识点:一对多创建数据)

    1、找到出版“金瓶眉”的出版社所在的地址(一对多查询)

    2、多对多

    创建一张author表,字段有name。

    给book表和author表添加多对多的关系。(ManyToManyField)  

    给author添加两个作者:egon和alex        (准备工作、用save和create两种方式完成)

    给book表和author表添加关联,id=2的书同时由egon和alex两个人写。(创建数据多对多)

    2-1

    取消book表和author表两张表之间的关联。

    参考:

    book_obj.authors.clear() #直接清空绑定的关系

    autho=Author.objects.get(name='alex') 找到名字叫做'alex'的作者对象

    book_obj.authors.remove(autho)            #删除指定的作者对象。

    book_obj.delete()

    2-2

    给水壶传绑定所有的作者。

    参考:

    def add(request):

             author_list=Author.objects.all()                #给一本书绑定所有的作者

             book_obj.authors.add(*author_list)        #一本书绑定所有的作者,

    3、级联删除

    将金瓶眉删除和它相关联的数据也删除(级联删除)

    参考:

    Book_obj=Book.objects.get(id=3)

    Book_obj.delete()    #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。

    1、连接Mysql数据库

    Settings中的代码:

    DATABASES = {

        'default': {

            'ENGINE': 'django.db.backends.mysql',

            'NAME': 'books',   #你的数据库名称

            'USER': 'root',        #你的数据库用户名

            'PASSWORD': '',       #你的数据库密码

            'HOST': '',                  #你的数据库主机,留空默认为localhost

            'PORT': '3306',         #你的数据库端口

        }

    }

    __init__.py中的代码:
    import pymysql
    pymysql.install_as_MySQLdb()          ##settings.py同一个目录的__init__.py

    3、建表 day67

    Urls.py中的代码:

    from  app01 import views
    url(r'^add/', views.add),

    Models.py

    class Publish(models.Model):

        name = models.CharField(max_length=32)

        addr = models.CharField(max_length=32)

        def __str__(self):

            return self.name+" "+self.addr

     

    # Book  Publish是一对多的关系 :models.ForeignKey(Publish)

    class Book(models.Model):


        title=models.CharField(max_length=32)
        price=models.DecimalField(max_digits=6,decimal_places=2)

        #创建外键一对多的关系
       
    publish=models.ForeignKey(Publish)#添加外键,括号中指定表名后,会自动识别publish表中的主键。
    def __str__(self):
    return self.title

    2、单表添加数据

    # 添加记录两种方式:
    # create 方式
    Publish.objects.create(
        name="老衲出版社",
        addr="沙河"
    )

    # save方式
    p=Publish(name="瞎驴出版社",addr="昌平区")
    p.save()

    查询API:

         表.objects.all()         得到是QuerySet集合对象------ [obj1,obj2,]

         表.objects.filter(id=2)  得到是QuerySet集合对象-------[obj1,]

         表.objects.get(id=2)     得到是一个Model对象   obj            有且只能有一条匹配的结果,否则报错。

    3、添加一对多数据 day67

    views.py

    方法1

    #在执行下面的代码之前,先在publish表里面插入两条数据
    # 一对多 添加一个book记录 方法1
    def add(request):
        Book.objects.create(
            title="python",
            price=100.00,
            publish_id=2
        )
        return HttpResponse("ok")
     
     
      
      
      
      
      
      
      
      
      
      
      
      
     
     
     
    
     
    
    def add(request):
        book_obj=Book.objects.get(id=1)
    print(book_obj.title)
    print(book_obj.price)
    print(book_obj.publish)    打印id等于1的外键对象。在model.py中写了__str__,所以会打印对象的属性。
     

    方法2

    # 一对多,添加一个book记录
    publish_obj=Publish.objects.get(id=1)    一个publish对象

    # 创建一个Book对象
    Book.objects.create(
        title="Linux",
        price=29.00,
        publish=publish_obj     #可以为外键字段指定一个对象作为外键
    )

    ###########################################################3

    save 方法

    # 一对多 save 方法
    b=Book(title="",price="",publish=pub_obj)
    b.save()

    b = Book(title="", price="", publish_id=1)
    b.save()

    Python manage.py makemigrations  #生成数据库脚本

    Python manage.py migrate                 #同步数据库

    Python manage.py runserver 8800   #启动项目

    多对多的关系day67

    Models.py中的代码

    # Book Publish是一对多的关系

    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
        def __str__(self):
            return self.name+" "+self.addr
    class Book(models.Model):
        title=models.CharField(max_length=32)
        price=models.DecimalField(max_digits=6,decimal_places=2)
        publish=models.ForeignKey(Publish)            #创建外键一对多的关系
        authors=models.ManyToManyField("Author")      # 创建外键多对多的关系。加上引号Author这张表即使在下面也可以找到
        def __str__(self):
            return self.title

    class Author(models.Model):
        name=models.CharField(max_length=32)
        def __str__(self):
            return  self.name        #打印queryset集合元素的name
     
    

    # 添加多对多关系

    # +++++++++++++++++++通过对象绑定关系
    def add(request):
    book_obj=Book.objects.get(id=3)  #找到id=3的书的对象
         print("authors:  ",book_obj.authors.all()) # 找到id=3的这本书所有关联的作者对象集合 [author1,author2,]
     
    
    # 绑定关系
         author_obj1=Author.objects.get(id=1)       #获取作者对象
    author_obj2=Author.objects.get(id=2)       #获取作者对象
    book_obj.authors.add(author_obj1,author_obj2)      #给book和author绑定关系
        return HttpResponse("OK")

    #第二种情况

    def add(request):

        author_list=Author.objects.all()       #给一本书绑定所有的作者
        book_obj.authors.add(*author_list)     #一本书绑定所有的作者,
     
    *列表名:传实参             如果传列表就加*        ; 如果传字典就加:**。    
     

    手动添加多对多关系表

    ################自己创建第三张表

    Models.py中的代码

    class Book2Author(models.Model):
        book=models.ForeignKey("Book")
        author=models.ForeignKey("Author")

    views.py文件中的代码

    # 向手动创建的第三张表中添加记录
    b2a=Book2Author(book_id=4,author_id=3)
    b2a.save()

    解除多对多绑定

    book_obj.authors.clear() #直接清空绑定的关系

    autho=Author.objects.get(name='alex')      找到名字叫做'alex'的作者对象
    book_obj.authors.remove(autho)       #删除指定的作者对象。
    book_obj.delete()

    级联删除:day67-06-00:13:30

    Book_obj=Book.objects.get(id=3)

    Book_obj.delete()    #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。

  • 相关阅读:
    PAT1037:Magic Coupon
    PAT1081:Rational Sum
    PAT1039: Course List for Student
    PAT1069:The Black Hole of Numbers
    VC++中字符串编码处理的一些相关问题
    PAT1110:Complete Binary Tree
    Java编译器003---javac -d/-sourcepath/-classpath选项
    Java编译器002---javac -source/-target选项
    Java编译器001---javac -g选项
    力扣练习010---把字符串转换成整数
  • 原文地址:https://www.cnblogs.com/linuxws/p/7570828.html
Copyright © 2020-2023  润新知