Как использовать функцию NTILE с другими филями в запросах Django?
У меня есть такие модели django, и мне нужно запросить имя и доход, разделенные на диапазоны, поэтому я использую ntile для этого:
class Bookings(models.Model):
bookid = models.IntegerField(primary_key=True)
facid = models.ForeignKey('Facilities', models.DO_NOTHING, db_column='facid')
memid = models.ForeignKey('Members', models.DO_NOTHING, db_column='memid')
starttime = models.DateTimeField()
slots = models.IntegerField()
class Facilities(models.Model):
facid = models.IntegerField(primary_key=True)
name = models.CharField(max_length=100)
membercost = models.DecimalField(max_digits=65535, decimal_places=65535)
guestcost = models.DecimalField(max_digits=65535, decimal_places=65535)
# Here I need to query name and revenue divided by ranges
total = Sum(
Case(
When(
Q(bookings__memid=0),
then=F('guestcost') * F('bookings__slots')
),
default=ExpressionWrapper(
F('membercost') * F('bookings__slots'),
output_field=DecimalField()
)
)
)
result = Facilities.objects.all().annotate(
revenue=Window(
expression=Ntile(num_buckets=3),
order_by=total
),
).values('name', 'revenue')
Здесь у меня ошибка, что "facilities.facid" не находится в группе by, потому что Django строит такой SQL:
SELECT "facilities"."facid", "facilities"."name", "facilities"."membercost",
"facilities"."guestcost", "facilities"."initialoutlay",
"facilities"."monthlymaintenance", NTILE(3) OVER (ORDER BY SUM(CASE WHEN
"bookings"."memid" = 0 THEN ("facilities"."guestcost" * "bookings"."slots") ELSE
("facilities"."membercost" * "bookings"."slots") END)) AS "revenue" FROM "facilities"
LEFT OUTER JOIN "bookings" ON ("facilities"."facid" = "bookings"."facid")
Как заставить Django использовать имя в группе по?