code example

 avatar
unknown
python
4 years ago
4.3 kB
6
Indexable

### Order Detail Serializer Example

class OrderGetSerializer(serializers.ModelSerializer):
    customer = OrderCustomerSerializer()
    products = serializers.SerializerMethodField(method_name="get_order_items")
    coupon = serializers.SlugRelatedField(
        queryset=Coupon.objects.all(), required=False, write_only=True, slug_field="id"
    )
    shipping_information = serializers.SerializerMethodField(
        method_name="get_shipping_information", allow_null=True
    )
    transactions = serializers.SerializerMethodField(method_name="get_transactions")
    shipping_address = serializers.SerializerMethodField(
        method_name="get_shipping_address"
    )
    billing_address = serializers.SerializerMethodField(
        method_name="get_billing_address"
    )
    order_history = serializers.SerializerMethodField(method_name="get_order_history")

    class Meta:
        model = Order
        fields = [
            "id",
            "order_id",
            "customer",
            "products",
            "total_amount",
            "paid_status",
            "is_fulfilled",
            "is_shipped",
            "description",
            "applied_coupon",
            "shipping_address",
            "billing_address",
            "coupon",
            "created_at",
            "shipping_information",
            "transactions",
            "order_history",
        ]

    def get_total_minus_shipping(self, obj):
        total_amount = float(obj.total_amount)
        if ShippingOrder.objects.filter(order=obj, shipmentCost__isnull=False).exists():
            shipment_cost = float(obj.shippingorder.shipmentCost)
            order_total = total_amount - shipment_cost
            return round(order_total, 2)
        else:
            return round(total_amount, 2)

    def get_shipping_information(self, obj):
        if ShippingOrder.objects.filter(order=obj).exists():
            shipping_information = obj.shippingorder
            serializer = ShippingOrderSerializer(shipping_information)
            return serializer.data
        return None

    def get_order_items(self, obj):
        if obj.linked_with is not None:
            items = obj.linked_with.modifiedproductscampaign_set.all()
            serializer = GetProductItemsSerializer(items, many=True)
        else:
            items = obj.items
            serializer = GetOrderItemSerializer(items, many=True)
        return serializer.data

    def get_order_history(self, obj):
        items = obj.orderhistory_set.all()
        serializer = OrderHistorySerializer(items, many=True)
        return serializer.data

    def get_transactions(self, obj):
        transactions = obj.transaction_set.all()
        serializer = TransactionSerializer(transactions, many=True)
        return serializer.data

    def get_shipping_address(self, obj):
        shipping_address = obj.shipping_address
        serializer = CustomerAddressSerializer(shipping_address)
        return serializer.data

    def get_billing_address(self, obj):
        billing_address = obj.billing_address
        serializer = CustomerAddressSerializer(billing_address)
        return serializer.data



### Orders View Example
class GetOrdersByShopView(generics.ListAPIView):
    permission_classes = (
        IsAuthenticated,
        IsStaffGroups,
    )
    serializer_class = ShopOrdersSerializer
    queryset = Order.objects.all()
    parser_classes = [JSONParser, FormParser, MultiPartParser]
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    search_fields = ["order_id", "customer__first_name"]

    @method_decorator(
        name="get",
        decorator=swagger_auto_schema(
            operation_id="Get orders by shop id"))
    def get(self, request, shop_id, format=None):
        user = get_current_user(request)
        shop = shop_verification(shop_id)
        staff_check(shop, user)
        paginator = TotalPagesPagination()
        orders = (
            Order.objects.select_related("customer").filter(deleted=False, shop=shop).order_by("-created_at")
        )
        filter_backends = self.filter_queryset(orders)
        paginated_data = paginator.paginate_queryset(filter_backends, request)
        serializer = ShopOrdersSerializer(paginated_data, many=True)
        return paginator.get_paginated_response(serializer.data)


Editor is loading...