# 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 屬性來覆蓋這個默認值。