美文网首页
关联对象参考

关联对象参考

作者: SingleDiego | 来源:发表于2018-05-21 11:29 被阅读15次

    官方文档

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

    ForeignKey 关系中:

    from django.db import models
    
    class Reporter(models.Model):
        name = models.CharField(max_length=50)
    
    
    class Article(models.Model):
        title = models.CharField(max_length=50)
        reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    

    在上面的例子中,Django 为我们自动生成了 reporter.article_set 管理器,可以实现子表对母表的关联管理,都将拥有以下方法。

    ManyToManyField 关系中:

    from django.db import models
    
    class Topping(models.Model):
        food = models.CharField(max_length=50)
    
        def __str__(self):
            return self.name
    
    
    class Pizza(models.Model):
        name = models.CharField(max_length=50)
        toppings = models.ManyToManyField(Topping)
    
        def __str__(self):
            return self.name
    

    这个例子中,topping.pizza_setpizza.toppings 两个管理器都将拥有以下方法。




    add(*objs, bulk=True)

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

    # ManyToManyField 关系
    # 把一个子表对象添加到母表对象的关联中
    
    p = Pizza.objects.get(pk=2)
    t = Topping.objects.get(pk=1)
    t.pizza_set.add(p)
    

    在上述示例中,在 ForeignKey 关系的情况下,使用 QuerySet.update()
    来执行更新。 它要求对象已经被保存,例如:

    r = Reporter.objects.get(pk=1)
    a = Article.objects.filter(pk=2)
    a.update(reporter=r)
    

    create(**kwargs)

    # 为子表对象创建一个关联的母表对象 
    
    r = Reporter.objects.get(pk=1)
    r.article_set.create(title='文章a')
    

    这等价于:

    r = Reporter.objects.get(pk=1)
    a = Article(
        title = '文章a',
        reporter = r
        )
    a.save(force_insert=True)
    

    remove(*objs)

    # 把子表对象从母表对象的关联中移除 
    
    p = Pizza.objects.get(pk=2)
    t = Topping.objects.get(pk=1)
    t.pizza_set.remove(p)
    

    clear()

    # 把子表对象的所有和母表关联移除 
    # 现在所有 pizza 都不包含这个 topping
    
    p = Pizza.objects.get(pk=2)
    t = Topping.objects.get(pk=1)
    t.pizza_set.clear()
    

    set(objs, bulk=True, clear=False)

    # 把子表对象同时添加到几个母表对象的关联中
    # p2,p3 两个 pizza 对象都会拥有 t 这个 topping
    
    p2 = Pizza.objects.get(pk=2)
    p3 = Pizza.objects.get(pk=3)
    p_list = [p2, p3]
    
    t = Topping.objects.get(pk=1)
    t.pizza_set.set(p_list)
    

    相关文章

      网友评论

          本文标题:关联对象参考

          本文链接:https://www.haomeiwen.com/subject/pxtadftx.html