django-commons / drf-excel

An XLSX spreadsheet renderer for Django REST Framework.
BSD 3-Clause "New" or "Revised" License
217 stars 40 forks source link

Types are not recognized in methods #79

Open aliqb opened 10 months ago

aliqb commented 10 months ago

If I have a integerField, the excel column will be number but if I have a method in my model or serializer that return int, the excel column will be text for ex:

class Statuses(models.IntegerChoices):
    SUPERVISOR = 0, _("awaiting supervisor's approval")
    EXPERT = 1, _("awaiting expert's approval")
    ACTIVE = 2, _("active")
    EXPIRE = 3, _("expired")
    EXTENDED = 4, _("extended")
    REJECT = -1, _("rejected")

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    service = models.ForeignKey(Service, on_delete=models.CASCADE)
    status = models.IntegerField(choices=Statuses.choices, default=1)
    start_date = models.DateField(null=True, blank=True)
    duration = models.PositiveBigIntegerField(null=False)
    buy_date_time = models.DateTimeField(auto_now_add=True)
    paid_credit = models.PositiveIntegerField(null=True)

    @property
    def duration_hours(self):
        return self.duration // 3600000

    @property
    def total_price(self):
        return self.service.price * self.duration_hours

and a serializer with all fields, duration column will be number but total_price will be text I seek in documentation but I didn't find a solution use format for column data style does not work

kike-reveni commented 2 months ago

@aliqb I was having a similar issue. I think the problem might be with the type of field, if you check the _drf_to_xlsx_field function, there is a list of conditions that based on the type of field, it will assign a XLSX field. So here it checks for numeric fields. If there is no match, it will use the default field. So you probably need to make sure that your Serializer field is of numeric type.