from django.db.models import Subquery, JSONField

class PostgresqlJsonField(JSONField):
    def from_db_value(self, value, expression, connection):
        return value

class SubqueryJson(Subquery):
    """
    A replacement for select_related, that allows to fetch row of linked data as a subquery
    """
    template = "(SELECT row_to_json(_subquery) FROM (%(subquery)s) _subquery)"
    output_field = PostgresqlJsonField()

class SubqueryJsonAgg(Subquery):
    """
    A replacement for prefetch_related, that allows to fetch array of linked data as a subquery
    """
    template = "(SELECT array_to_json(coalesce(array_agg(row_to_json(_subquery)), array[]::json[])) FROM (%(subquery)s) _subquery)"
    output_field = PostgresqlJsonField()