zoukankan      html  css  js  c++  java
  • 关联管理器(RelatedManager)

     

    关联管理器(RelatedManager)

     

    一、class RelatedManager

      "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况:

    1、一对多

        ForeignKey关系的“另一边”。像这样:

    `from` `django.db ``import` `models`` ` `class` `Publish(models.Model):``    ``pass`` ` `class` `Book(models.Model):``    ``publish ``=` `models.ForeignKey(``"Publish"``, on_delete``=``models.CASCADE)`

        在上面的例子中,管理器publish_obj.book_set 会拥有下面介绍的方法。

    2、多对多

        ManyToManyField关系的两边:

    `class` `Author(models.Model):``    ``pass`  `class` `Book(models.Model):``    ``authors ``=` `models.ManyToManyField(``"Author"``)`

        在这个例子中,book_obj.authors 和author_obj.book_set 都拥有下面的方法。

    3、方法合集

    1、add(obj1[, obj2, ...])

    把指定的模型对象添加到关联对象集中。

    例如:

    >>> author_obj = Author.objects.get(id=1)
    >>> book_obj = Book.objects.get(id=2)
    >>> author_obj .book_set.add(e)
    在上面的例子中,对于ForeignKey关系,book_obj.save()由关联管理器调用,执行更新操作。然而,在多对多关系中使用add()并不会调用任何 save()方法,而是由QuerySet.bulk_create()创建关系。

    延伸:

    # 1 *[]的使用
    >>> book_obj = Book.objects.get(id=1)
    >>> author_list = Author.objects.filter(id__gt=2)
    >>> book_obj.authors.add(*author_list)


    # 2 直接绑定主键
    book_obj.authors.add(*[1,3]) # 将id=1和id=3的作者对象添加到这本书的作者集合中
                                # 应用: 添加或者编辑时,提交作者信息时可以用到.

    2、create(**kwargs)

    创建一个新的对象,保存对象,并将它添加到关联对象集之中。返回新创建的对象:

    >>> author_obj = Author.objects.get(id=1)
    >>> book = author_obj.book_set.create(
      ...
      title='挤奶龙爪手',
      ...
    )

    # No need to call e.save() at this point -- it's already been saved.
    这完全等价于(不过更加简洁于):

    >>> author_obj = Author.objects.get(id=1)
    >>> book = Book(
      ...
      title='挤奶龙爪手',
      ...
    )
    >>> author_obj.save(force_insert=True)
    要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中,我们并没有传入author_obj参数给create()。Django会明白新的 Book对象author_obj 应该添加到author_obj中。

    3、remove(obj1[, obj2, ...])
    从关联对象集中移除执行的模型对象:

    >>> author_obj = Author.objects.get(id=1)
    >>> book_obj = Book.objects.get(id=2)
    >>> author_obj .book_set.remove(book_obj)
    对于ForeignKey对象,这个方法仅在null=True时存在。
    4、clear()

    从关联对象集中移除一切对象。

    >>> author_obj = Author.objects.get(id=1)
    >>> author_obj.book_set.clear()
    注意这样不会删除对象 —— 只会删除他们之间的关联。

    就像 remove() 方法一样,clear()只能在 null=True的ForeignKey上被调用。

    5、set()方法

        先清空,在设置,编辑书籍时即可用到。

    book = models.Book.objects.filter(title="独孤九剑").first()
    book.authors.set([1, 3])  

    注意:

    对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

  • 相关阅读:
    pch”预编译头文件来自编译器的其他版本,或者预编译头为 C++ 而在 C 中使用它(或相反) and vs找不到路径
    VC++获得当前系统时间的几种方案
    无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用
    error C2381: “exit” : 重定义
    vs2019 link glaux.lib 无法解析的外部符号,是缺少一个Lib
    操作系统算法整理+汇总
    vs2019配置glm包
    第二题 既约分数
    死磕Spring之IoC篇
    精尽Spring Boot源码分析
  • 原文地址:https://www.cnblogs.com/zengxiaowen/p/11838614.html
Copyright © 2011-2022 走看看