Django Related objects

135 阅读1分钟

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的关系集合中.