Django ORM - Reverse Relationship Query

Django 反向查詢

Posted by Young on 2022-11-25
Estimated Reading Time 1 Minutes
Words 347 In Total
Viewed Times

Django 關聯關係查詢

Django 中的每一中關聯關係都可以是實現反向查詢,我們對三種關係的關聯反向查詢依次進行介紹,其實只要掌握了其中一種,大家就可以領悟反向的查詢是如何進行應用的。

範例

以 Order 和 OrderItem 這兩個 Model 為例,OrderItem 有一個 ForeignKey 指向 Order。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# models.py
class Order(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
paymentMethod = models.CharField(max_length=200, null=True, blank=True)
........
def __str__(self):
return str(self.createdAt)

class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
.......
def __str__(self):
return str(self.name)

在 OrderSerializer 中,我們想透過反向查詢,來取得 OrderItem 的資料,並且將其序列化。

1
2
3
4
5
6
7
8
9
10
11
12
13
# serializers.py
class OrderSerializer(serializers.ModelSerializer):
orderItems = serializers.SerializerMethodField(read_only=True)
shippingAddress = serializers.SerializerMethodField(read_only=True)
.......
class Meta:
model = Order
fields = '__all__'
def get_orderItems(self,obj):
items = obj.orderitem_set.all() #一對多關聯,orderitem_set 是 django 為 OrderItems Model 預設的反向關聯名稱
serializer = OrderItemSerializer(items,many=True)
return serializer.data
.........

當在 OrderItem 模型中定義一個指向 Order 的外鍵字段時,如上所述(order = models.ForeignKey(Order, on_delete=models.CASCADE)),Django 會自動在 Order 模型中創建一個反向關系。這個反向關系的名稱默認是小寫的模型名稱(在這里是 orderitem)後面加上 _set(在這里是 orderitem_set)。

也可以通過在模型中定義 related_name 屬性來覆蓋這個默認值。


若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~


留言版