【问题标题】:How to use another serializer only for CREATE response?如何仅将另一个序列化程序用于 CREATE 响应?
【发布时间】:2020-09-18 06:55:09
【问题描述】:

我正在制作商店管理 API。我会尽快描述我的问题。

当我进行交易时,我得到一个 CREATE 响应,

{
    "id": 14,
    "order": 1,
    "shop": 3,
    "product": 2,
    "quantity": 2,
    "bill": 600
}

但我希望得到如下产品详细信息的回复。

{
  "id": 14,
  "order": 1,
  "shop": 3,
  "product": {
    "id": 2,
    "name": "Product 2 for Shop 1",
    "buying_price": 200,
    "selling_price": 300,
    "stock": 34,
    "shop": 3
  },
  "quantity": 2,
  "bill": 600
}

所以我尝试self.action 为 CREATE 时更改序列化程序。但问题是,现在它在我的事务中显示产品创建字段。

模型

class Product(models.Model):
    """Product model"""

    name = models.CharField(max_length=255)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    buying_price = models.PositiveIntegerField(default=0)
    selling_price = models.PositiveIntegerField(default=0)
    stock = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.name

class Transaction(models.Model):
    """Model for keeping customer ordered items"""

    order = models.ForeignKey(CustomerTrasnscation, on_delete=models.CASCADE, null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
    quantity = models.PositiveIntegerField(default=0)
    bill = models.PositiveIntegerField(default=0)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, null=True)

视图集

class TransactionViewSet(viewsets.ModelViewSet):

    authentication_classes = (TokenAuthentication,)
    queryset = models.Transaction.objects.all()
    serializer_class = serializers.TransactionSerializer

    def perform_create(self, serializer):
        own_shop = getShop(self.request.user)
        serializer.save(shop=own_shop)

    def get_serializer_class(self):
        if self.action in ["list", "retrieve", "create"]:
            return serializers.Trasnscation_With_ProductDetailSerializer

        return self.serializer_class

问题

如您所见,它不是显示产品名称,而是显示产品创建字段。

注意: Trasnscation_With_ProductDetailSerializerlistretrieve 操作上运行良好。

【问题讨论】:

标签: django-rest-framework


【解决方案1】:

您必须覆盖您的“创建”方法,因为您的主序列化程序将 serializers.TransactionSerializer 但将使用 serializers.Trasnscation_With_ProductDetailSerializer 生成响应

def get_serializer_class(self):
    if self.action in ["list", "retrieve"]:
        return serializers.Trasnscation_With_ProductDetailSerializer

    return self.serializer_class

def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    obj = self.perform_create(serializer)

    serializer = serializers.Trasnscation_With_ProductDetailSerializer()(obj)

    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

【讨论】:

  • @saifahmedanik 如果此答案对您有用,请将其标记为正确,以便其他人也可以从中受益,谢谢。
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多