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

    知识预览:

    class RelatedManager

     

    class RelatedManager

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

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

    from django.db import models
     
    class Reporter(models.Model):
        # ...
        pass
     
    class Article(models.Model):
        reporter = models.ForeignKey(Reporter)

    在上面的例子中,管理器reporter.article_set拥有下面的方法。

    ManyToManyField关系的两边:

    class Topping(models.Model):
        # ...
        pass
     
    class Pizza(models.Model):
        toppings = models.ManyToManyField(Topping)

    这个例子中,topping.pizza_set 和pizza.toppings都拥有下面的方法。

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

    把指定的模型对象添加到关联对象集中。
    
    例如:
    
    >>> b = Blog.objects.get(id=1)
    >>> e = Entry.objects.get(id=234)
    >>> b.entry_set.add(e) # Associates Entry e with Blog b.
    在上面的例子中,对于ForeignKey关系,e.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的作者对象添加到这本书的作者集合中
                                  # 应用: 添加或者编辑时,提交作者信息时可以用到.  

    create(**kwargs)

    创建一个新的对象,保存对象,并将它添加到关联对象集之中。返回新创建的对象:
    
    >>> b = Blog.objects.get(id=1)
    >>> e = b.entry_set.create(
    ...     headline='Hello',
    ...     body_text='Hi',
    ...     pub_date=datetime.date(2005, 1, 1)
    ... )
    
    # No need to call e.save() at this point -- it's already been saved.
    这完全等价于(不过更加简洁于):
    
    >>> b = Blog.objects.get(id=1)
    >>> e = Entry(
    ...     blog=b,
    ...     headline='Hello',
    ...     body_text='Hi',
    ...     pub_date=datetime.date(2005, 1, 1)
    ... )
    >>> e.save(force_insert=True)
    要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中,我们并没有传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。

    remove(obj1[, obj2, ...])

    从关联对象集中移除执行的模型对象:
    
    >>> b = Blog.objects.get(id=1)
    >>> e = Entry.objects.get(id=234)
    >>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.
    对于ForeignKey对象,这个方法仅在null=True时存在。

    clear()

    从关联对象集中移除一切对象。
    
    >>> b = Blog.objects.get(id=1)
    >>> b.entry_set.clear()
    注意这样不会删除对象 —— 只会删除他们之间的关联。
    
    就像 remove() 方法一样,clear()只能在 null=True的ForeignKey上被调用。

    set()方法

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

    注意

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

    直接赋值:

    通过赋值一个新的可迭代的对象,关联对象集可以被整体替换掉。

    >>> new_list = [obj1, obj2, obj3]
    >>> e.related_set = new_list
    

      如果外键关系满足null=True,关联管理器会在添加new_list中的内容之前,首先调用clear()方法来解除关联集中一切已存在对象的关联。否则, new_list中的对象会在已存在的关联的基础上被添加。

  • 相关阅读:
    TextureView获取RGBA
    直播预告 | 微软云:助力加速企业数字化转型
    安全无极限,防护向未来——Check Point 安全运维分享会
    数字未来·始物于行 荣之联IT赋能者峰会
    掌控安全 云领创新 —— 2018深信服亚太区巡展
    Dynatrace人工智能如何帮你更好管理云上运维
    Microsoft 365 DevDays
    买TOKENSKY区块链大会通证 豪送首尔一日游
    人工智能的背景下,物联网行业将面临怎样的发展趋势?
    走进四维图新,甲骨文红科技为智能汽车大脑赋能
  • 原文地址:https://www.cnblogs.com/lingcai/p/9855983.html
Copyright © 2011-2022 走看看