zoukankan      html  css  js  c++  java
  • Django ORM多表操作

    1、表与表之间的关系

    一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面
    一对多(ForeignKey):一对多字段建在多的那一方
    多对多(ManyToManyField):多对多字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面
    
    ps:如何判断表与表之间到底是什么关系:
        换位思考
            A能不能有多个B
            B能不能有多个A

    2、创建各个表

    # 以图书管理系统为例,创建表
    
    #modele.py文件
    # 图书
    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        publish_date = models.DateField(auto_now_add=True)
        # 外键关系
        publish = models.ForeignKey(to='Publish')
        # 多对多
        authors = models.ManyToManyField(to='Author')
    
    # 出版社
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
        email= models.EmailField()
    
    # 作者
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        # 一对一
        authordetail = models.OneToOneField(to='AuthorDetail')
    
    # 作者信息
    class AuthorDetail(models.Model):
        phone = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)

    改动modele.py文件后 需要执行以下命令:

    python3 manage.py makemigrations 
    python3 manage.py migrate

    3、多对多字段增删改查

    #------------------------------
    # 给书籍绑定与作者之间的关系
    #添加关系 add:支持传数字或对象,并且都可以传多个

    book_obj = models.Book.objects.filter(pk=3).first()
    # 给id为3的书籍对象,添加一个对应authors为1的关系,这种关系会被记录到app01_book_authors表中 book_obj.authors.add(
    1) book_obj.authors.add(2,3) author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=3).first() # book_obj.authors.add(author_obj) book_obj.authors.add(author_obj,author_obj1) #------------------------------ # 修改书籍与作者的关系 set() set传的必须是可迭代对象!!! # 可以传数字和对象,并且支持传多个 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set((1,)) book_obj.authors.set((1,2,3)) author_list = models.Author.objects.all() book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set(author_list) #------------------------------ # 删除书籍与作者的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.remove(1) book_obj.authors.remove(2,3) #删一个对象 author_obj = models.Author.objects.all().first() book_obj.authors.remove(author_obj) #删多个对象 author_list = models.Author.objects.all() book_obj.authors.remove(*author_list) # 需要将queryset打散 #------------------------------ # 清空 clear() 清空的是你当前这个表记录对应的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.clear()
  • 相关阅读:
    Jsp入门EL表达式_学习笔记
    sql-DDL, DML 常用语句
    sql-DDL, DML 常用语句
    sql-DDL, DML 常用语句
    sql-DDL, DML 常用语句
    谁需要GUI?快看Linux 终端生存之道
    谁需要GUI?快看Linux 终端生存之道
    谁需要GUI?快看Linux 终端生存之道
    谁需要GUI?快看Linux 终端生存之道
    2.3 根据层级查找元素
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/12362408.html
Copyright © 2011-2022 走看看