dabapps / django-readers

A lightweight function-oriented toolkit for better organisation of business logic and efficient selection and projection of data in Django projects.

Home Page:https://www.django-readers.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

When i use project, the decimal value shows up as Decimal('1.00') how do i make all decimal show up as '1.00' str?

simkimsia opened this issue · comments

related to #60

def get_product_package_details_by_id(pk):
    """
    get product package by id for details
    """
    spec_for_pp_line_items = [
        "id",
        {
            "product": [
                "description_in_mus",
                "description_sow",
                "id",
                "product_number",
                "unit",
            ]
        },
        "quantity"
    ]
    spec = [
        "id",
        "name",
        {
            "product_package_line_items": spec_for_pp_line_items
        },
    ]

    prepare, project = specs.process(spec)
    product_package = prepare(ProductPackage.objects.all()).get(pk=pk)

    return project(product_package)

the quantity shows up as Decimal('1.00') how do i make it become '1.00' string?

I saw this

project = projectors.combine(
    projectors.producer_to_projector("name", producers.attr("name")),
    projectors.producer_to_projector("age", produce_age),
    projectors.producer_to_projector(
        "book_set",
        producers.relationship(
            "book_set",
            projectors.combine(
                projectors.producer_to_projector("title", producers.attr("title")),
                projectors.producer_to_projector(
                    "publication_year",
                    producers.attr("publication_year"),
                ),
            ),
        ),
    ),
)

Does this mean i need to repeat the specs and one by one state the projector? Is there a simpler way? i only care about quantity in my case.

It depends what you want to do with your projected result dictionary. If you're building an API and so using Django REST framework or using Django's JSONResponse, the encoder will do this for you. If you really want to do it yourself, you can replace just that field name in the spec with the corresponding pair function and use the transform_value argument, like this:

from django_readers import pairs

spec_for_pp_line_items = [
    "id",
    {
        "product": [
            "description_in_mus",
            "description_sow",
            "id",
            "product_number",
            "unit",
        ]
    },
    {"quantity": pairs.field("quantity", transform_value=str)}
]

If you're building an API and so using Django REST framework or using Django's JSONResponse, the encoder will do this for you

I am not. I am using django template and passing in the context and there's a javascript that needs to take in the str version of decimal.

This is great. Thank you. @j4mie

You should add this note about encoder for DRF and example for decimal in the readme.

@simkimsia you could also do this in the template with intcomma

You should add this note about encoder for DRF and example for decimal in the readme.

Currently (very) slowly working on proper docs in #59