【问题标题】:Django serializer and displayDjango 序列化器和显示
【发布时间】:2019-08-16 19:23:04
【问题描述】:

我有一个包含付款和支付线的一对多关系模型。如何将所有支付线与相同的项目分组并显示在序列化程序中。关键是付款属于同一订单,订单id是付款模型中的属性之一。

views.py

class OrderItemViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Payment.objects.all()

def get_queryset(self):
    return self.queryset.filter(order_id=self.request.GET.get("order_id"))

serializer_class = PaymentSerializer

serializers.py:

class PaymentLineSerializer(ModelSerializer):
   class Meta:
       model = PaymentLine
       fields = (
           "item_number",
           "currency",
           "available_quantity",
           "order_total_amount",
       )

class PaymentSerializer(ModelSerializer):

   payment_lines = PaymentLineSerializer(PaymentLine.objects.select_related("payment"), many=True)

   class Meta:
       model = Payment
       fields = ("order_id", "total_amount", "currency", "payment_lines")

要显示这个 json:

[
    {
        "order_id": 4,
        "total_amount": "250.964024",     
        "currency": "USD",
        "payment_lines": [
            {
                "item_number": 1100,
                "currency": "USD",
                "available_quantity": 0,
                "order_total_amount": 0,
            },
            {
                "item_number": 1200,
                "currency": "USD",
                "available_quantity": 1,
                "order_total_amount": 224.982012,
            }
        ]
    }
]

而不是这个:

[
    {
        "order_id": 4,
        "total_amount": "444.700000",
        "currency": "USD",
        "payment_lines": [
            {
                "item_number": 1100,
                "currency": "USD",
                "available_quantity": 1,
                "order_total_amount": 25.982012,

            },
            {
                "item_number": 1200,
                "currency": "USD",
                "available_quantity": 1,
                "order_total_amount": 224.982012,

            }
        ]
    },
    {
        "order_id": 4,
        "total_amount": "-25.982012",
        "external_reference_type": "MAG",
        "currency": "USD",
        "payment_lines": [
            {
                "item_number": 1100,
                "currency": "USD",
                "available_quantity": -1,
                "order_total_amount": -25.982012,

            }
        ]
    }
]

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    这个怎么样。我假设 paymentline_set 是您在 models.py 中的相关名称

    from django.db.models import Prefetch
    
    class OrderItemViewSet(viewsets.ReadOnlyModelViewSet):
         def get_queryset(self):
             return Payment.objects.filter(
                order_id=self.request.GET.get("order_id")
             ).prefetch_related(
                  Prefetch(
                      'paymentline_set',
                      queryset=PaymentLine.objects.all(),
                      to_attr='payment_lines'
                  )
             )  
    
    class PaymentSerializer(ModelSerializer):
         payment_lines = PaymentLineSerializer(many=True)
         class Meta:
             model = Payment
             fields = ("order_id", "total_amount", "currency", "payment_lines")
    

    您可以不使用Prefetch(),但.prefetch_related('paymentline_set') 然后将PaymentSerializer 中的payment_lines 更改为paymentline_set

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2019-02-19
      • 2016-09-29
      相关资源
      最近更新 更多