• 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()
  • 相关阅读:
    【板+背包】多重背包 HDU Coins
    【板+并查集判断连通性】并查集判断连通性
    【Dijstra堆优化】HDU 3986 Harry Potter and the Final Battle
    【区间筛】2017多校训练四 HDU6069 Counting Divisors
    【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
    【链表】2017多校训练三 HDU 6058 Kanade's sum
    【带权并查集】HDU 3047 Zjnu Stadium
    【优先级队列】 Holedox Eating
    ajax学习笔记3-jQuery实现ajax(大拇指向上)
    ajax学习笔记2-JSON形式返回(大拇指向上)
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/12362408.html
Copyright © 2020-2023  润新知