2017-02-13 46 views
0

只返回一個對象:過濾用戶反向關係,並考慮到這些模型在Django的REST框架

class Product(models.Model): 
    name = CharField(max_length=255) 

class Order(models.Model): 
    product = models.ForeignKey(Product) 
    user = models.ForeignKey(User) 
    quantity = models.PositiveIntegerField() 

一個用戶只能有每個產品一個訂單對象。我想要一個API調用來顯示產品列表,以及用戶的訂購位置。有沒有辦法做到這一點?

默認序列化列出order_set下的所有訂單。我確實有點超前與該用戶進行過濾:

class FilteredOrderSerializer(serialisers.ListSerializer): 
    def to_representation(self, data): 
     data = data.filter(user=self.context['request'].user) 
     return super(FilteredOrderSerializer, self).to_representation(data) 


class OrderSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Order 
     list_serializer_class = FilteredOrderSerializer 


class ProductSerializer(serializers.ModelSerializer): 
    order_set = OrderSerializer(many=True, read_only=True) 

    class Meta: 
     model = Product 

所以現在只顯示已驗證用戶的訂單,但由此產生的JSON看起來像

[ 
    { 
     "name": "prod1", 
     "order_set": [ 
      { 
       "quantity": 4 
      } 
     ], 
    } 
] 

即場仍稱order_set它是一個列表,我希望它被稱爲order並且可以是一個對象或null。所以我不確定應該在哪裏進行過濾,也不知道如何定義該字段。

編輯:我使用一個簡單的視圖集中

class ProductViewSet(view sets.ReadOnlyModelViewSet): 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer 
+0

對於您的視圖,您需要一些相同的細節。 –

+0

將以上視圖添加到 –

+0

您的ProductSerializer的外觀如何?修復只在那裏。 –

回答

1

您需要在您的訂單中添加related_name場,所以你可以

product.orders.all() 

那麼這應該做的。

class Order(models.Model): 
    product = models.ForeignKey(Product, related_name='orders') 
    user = models.ForeignKey(User) 
    quantity = models.PositiveIntegerField() 


class ProductSerializer(serializers.ModelSerializer): 
    order = serializers.SerializerMethodField() 

    class Meta: 
     model = Product 
     fields = ('name', 'order') 

    def get_order(self, object): 
     try: 
      order = object.orders.get(user=self.context['request'].user) 
      return SceneDetailSerializer(order).data 
     except Order.DoesNotExist: 
      return None 

更新:您可以嘗試串行器方法字段。不確定self是否包含上下文和用戶引用。您需要從訂單序列化器中刪除列表字段。讓我知道它是否有效。

+0

雖然這仍然會返回一個列表,但這是我的主要問題。我知道每個產品每個用戶會有一個訂單或沒有訂單,所以我想返回一個訂單或爲空。無論它被稱爲'order_set'還是'orders'都不重要。 ('訂單'會更好) –

+0

更新了一些東西。這可能工作。 –

+0

那種作品!我不得不'返回OrderSerializer(order).data',並且我得到了我正在尋找的JSON。不幸的是,SerializerMethodFields是隻讀的,但我試圖找到解決辦法。 –