# Django 關聯關係查詢
Django 中的每一中關聯關係都可以是實現反向查詢,我們對三種關係的關聯反向查詢依次進行介紹,其實只要掌握了其中一種,大家就可以領悟反向的查詢是如何進行應用的。
# 範例
以 Order 和 OrderItem 這兩個 Model 為例,OrderItem 有一個 ForeignKey 指向 Order。
# 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 的資料,並且將其序列化。
# 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 屬性來覆蓋這個默認值。
