多对多的关系.ORM Django

k44*_*k44 3 python django django-orm

class Toy(models.Model):
    name = models.CharField(max_length=20)
    desc = models.TextField()

class Box(models.Model):
    name = models.CharField(max_length=20)
    proprietor = models.ForeignKey(User, related_name='User_Box')
    toys = models.ManyToManyField(Toy, blank=True)
Run Code Online (Sandbox Code Playgroud)

如何创建一个将玩具添加到Box的视图?

def add_this_toy_to_box(request, toy_id):
Run Code Online (Sandbox Code Playgroud)

K Z*_*K Z 7

你可以使用Django RelatedManager:

"相关经理"是在一对多或多对多相关背景中使用的经理.这种情况发生在两种情况:

ForeignKey关系的"另一面".那是:

class Reporter(models.Model):
    ...

class Article(models.Model):
    reporter = models.ForeignKey(Reporter)
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,管理员可以使用以下方法reporter.article_set.

ManyToManyField关系的两面:

class Topping(models.Model):
    ...

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,下面的方法将可上都topping.pizza_set与上pizza.toppings.

这些相关经理有一些额外的方法:

  1. 要创建新对象,请将其保存并将其放入相关对象集中.返回新创建的对象:create(**kwargs)

    >>> b = Toy.objects.get(id=1)
    >>> e = b.box_set.create(
    ...     name='Hi',
    ... )
    
    # No need to call e.save() at this point -- it's already been saved.
    
    # OR:
    
    >>> b = Toy.objects.get(id=1)
    >>> e = Box(
    ...     toy=b,
    ...     name='Hi',
    ... )
    >>> e.save(force_insert=True)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要将模型对象添加到相关对象集:

    add(obj1[, obj2, ...])
    
    Run Code Online (Sandbox Code Playgroud)

    例:

    >>> t = Toy.objects.get(id=1)
    >>> b = Box.objects.get(id=234)
    >>> t.box_set.add(b) # Associates Box b with Toy t.
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要从相关对象集中删除指定的模型对象:

    remove(obj1[, obj2, ...])
    
    >>> b = Toy.objects.get(id=1)
    >>> e = Box.objects.get(id=234)
    >>> b.box_set.remove(e) # Disassociates Entry e from Blog b.
    
    Run Code Online (Sandbox Code Playgroud)

    为了防止数据库不一致,此方法仅存在于null = True的ForeignKey对象上.如果相关字段不能设置为None(NULL),则无法从关系中删除对象而不将其添加到另一个关联.在上面的示例中,从b.entry_set()中删除e等同于执行e.blog = None,并且因为博客ForeignKey没有null = True,所以这是无效的.

  4. 从相关对象集中删除所有对象:clear()

    >>> b = Toy.objects.get(id=1)
    >>> b.box_set.clear()
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这不会删除相关对象 - 它只是将它们取消关联.就像remove()一样,clear()仅在ForeignKeys上可用,其中null = True.


参考:关于处理相关对象的相关Django文档