related objects add方法
使用场景,在拥有one-to-many或者many-to-many的model进行操作.
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
def __str__(self):
return "%s the waiter at %s" % (self.name, self.restaurant)
这里以Restaurant和Waiter为例
>>> Restaurant.objects.all()
<QuerySet [<Restaurant: Demon Dogs the restaurant>, <Restaurant: Ace Hardware the restaurant>]>
>>> r1 = Restaurant.objects.all()[0]
>>> r2 = Restaurant.objects.all()[1]
>>> r1.waiter_set.all()
<QuerySet [<Waiter: Jackson the waiter at Demon Dogs the restaurant>, <Waiter: Mark the waiter at Demon Dogs the restaurant>]>
>>> w3 = Waiter.objects.create(name='Kale',restaurant=r2)
>>> w1
<Waiter: Jackson the waiter at Demon Dogs the restaurant>
>>> w2
<Waiter: Mark the waiter at Demon Dogs the restaurant>
>>> w3
<Waiter: Kale the waiter at Ace Hardware the restaurant>
>>> w3.restaurant
<Restaurant: Ace Hardware the restaurant>
>>> r1.waiter_set.add(w3)
>>> w3.restaurant
<Restaurant: Demon Dogs the restaurant>
>>> r1.waiter_set.all()
<QuerySet [<Waiter: Jackson the waiter at Demon Dogs the restaurant>, <Waiter: Mark the waiter at Demon Dogs the restaurant>, <Waiter: Kale the waiter at Demon Dogs the restaurant>]>
>>> r2.waiter_set.all()
<QuerySet []>
>>> r2.waiter_set.add(w3)
>>> r2.waiter_set.all()
<QuerySet [<Waiter: Kale the waiter at Ace Hardware the restaurant>]>
>>> r1.waiter_set.all()
<QuerySet [<Waiter: Jackson the waiter at Demon Dogs the restaurant>, <Waiter: Mark the waiter at Demon Dogs the restaurant>]>
简单的说,waiter与restaurant是多对一的关系,创建w3时,w3与r2是关联关系,也就是说w3属于r2的关系集合中,使用r1.waiter_set.add(w3),则把w3移动到r1的关系集合中.