• 多对多的操作


    已知表的关系是:

    models.py

    class Publisher(models.Model):
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return '<Publisher: {} - {}>'.format(self.pk, self.name)
    
    class Book(models.Model):
        title = models.CharField(max_length=32)
        publisher = models.ForeignKey('Publisher',related_name='books',related_query_name='book',on_delete=models.CASCADE)
    
        def __str__(self):
            return '<Book: {} - {}>'.format(self.pk, self.title)
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        books = models.ManyToManyField('Book')  #多对多创建,后面是要关联的表Book类
    
    

    >python manage.py makemigrations

    >python manage.py migrate

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
        import django
    
        django.setup()
    
        from app01 import models
    
        author_obj = models.Author.objects.get(pk=1)
        # print(author_obj)
        # print(author_obj.name)
        # # print(author_obj.books,type(author_obj.books))  #关系管理对象
        # print(author_obj.books.all())  #关联的所有对象
    
        book_obj = models.Book.objects.get(pk=3)
        # print(book_obj)
        # print(book_obj.title)
        # print(book_obj.author_set.all())
    
        # create
        # 通过作者对象创建书籍对象  app01_author_books 表自动加上了
        # ret = author_obj.books.create(title='二狗的余孽',publisher_id=1)
        # print(ret)
    
        # add 添加关系  关联的对象或者id app01_author_books表
        # ret = author_obj.books.add(1,2,3)  #id
        # print(ret) # None  但是app01_author_books 表自动加上了
    
        # ret = author_obj.books.add(*models.Book.objects.filter(id__in=[1, 2, 3]))  # 写对象,[]的话使用*打散
        # print(ret)
    
        #remove 删除关系  #外键的管理对象只能用对象  不能用id
        # author_obj.books.remove(*models.Book.objects.filter(id__in=[1, 2, 3]))
    
        #清空所有的关系
        # author_obj.books.clear()
    
        #set重新设置所有的关系
        # author_obj.books.set([1,2,3,4])
        # author_obj.books.set([1,2])  #覆盖,重新做一遍设置

     #补充:

     1、想通过管理对象清除关系的时候报错,如何解决:

    在字段加上null=True

    2、通过外键做add remove那里面就不能填id了。那里面必须填对象。

    总结:外键的管理对象只能用对象 不能用id

  • 相关阅读:
    并发实现-Callable/Future 实现返回值控制的线程
    Sql Server查询,关闭外键约束的sql
    Kettle-动态数据链接,使JOB得以复用
    Python爬虫实践~BeautifulSoup+urllib+Flask实现静态网页的爬取
    javaAPI操作Hbase
    Linux下的网络环境配置
    DataCleaner(4.5)第二章
    DataCleaner(4.5)第一章
    SpringBoot 使用 MyBatisPlus-Generator 快速生成model实体类
    Java 使用hutool工具类代替commons-text进行Json 中文 Unicode转换
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/10492839.html
Copyright © 2020-2023  润新知