Opened 2 years ago

Last modified 2 years ago

#33795 closed Bug

Django sync_to_async takes infinite time with asgiref==3.5.2 — at Version 1

Reported by: parfeniukink Owned by: nobody
Component: HTTP handling Version: 3.2
Severity: Normal Keywords: asgiref sync_to_async
Cc: Andrew Godwin, Carlton Gibson Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by parfeniukink)

Django==3.2.13
asgiref==3.5.2

If you will try to decorate any ORM function with sync_to_async you will wait forever.

asgiref==3.5.0 works fine

# models.py
class DTOManager(models.Manager):
    @sync_to_async
    def filter(self, *args, **kwargs) -> list[BaseModel]:
        return [self._dto_mapper(i) for i in self.model.objects.filter(*args, **kwargs)]

    @sync_to_async
    def get(self, *args, **kwargs) -> BaseModel:
        try:
            return self._dto_mapper(self.model.objects.get(*args, **kwargs))
        except self.model.DoesNotExist:
            raise ObjectNotFound(f"{self.model.__name__} not found")

class Hotel(models.Model):
    id = models.UUIDField(primary_key=True, editable=False)
    coordinates = models.PointField(null=True)

    dto_objects = DTOManager(dto_mapper=lambda hotel: HotelDTO(**hotel.curated_data) if hotel else None)
    objects = models.Manager()

# services.py
hotels = await Hotel.dto_objects.filter(id=12)

Change History (1)

comment:1 by parfeniukink, 2 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top