Я хочу вычислить некоторые статистические данные в моем приложении django.
С этой схемой
class Rank(models.Model):
rank_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
class Taxon(models.Model):
taxon_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
rank = models.ForeignKey(Rank)
class Passport(models.Model):
id:
taxa: models.ManyToMany(Taxon, through='TaxonPassport')
class Accession(models.Model):
id:
passports= models.ManyToManyField(Passport, through='AccessionPassport')
Я хочу рассчитать, сколько образцов для каждого сочетания рангов таксонов.
Это выражение запроса django, которое я хотел бы использовать:
queryset = Taxon.objects.filter(passport__accession__institute=self).distinct('passport__accession').values('name', 'rank__name').annotate(counts=Count('name'))
Но оно выдает ошибку без реализации: NotImplementedError: annotate () + Different (fields) не реализовано.
Чтобы решить эту проблему, я сделал запрос rawSql с «Select from Select»:
Select "taxon_id", "taxon_name", "name", COUNT(*) as counts from (
SELECT DISTINCT "vavilov2_integration_accession"."accession_id",
"vavilov2_integration_taxon"."taxon_id" as "taxon_id",
"vavilov2_integration_taxon"."name" as "taxon_name",
"vavilov2_integration_rank"."name"
FROM "vavilov2_integration_taxon"
INNER JOIN "vavilov2_integration_taxonpassport" ON ("vavilov2_integration_taxon"."taxon_id" = "vavilov2_integration_taxonpassport"."taxon_id")
INNER JOIN "vavilov2_integration_passport" ON ("vavilov2_integration_taxonpassport"."passport_id" = "vavilov2_integration_passport"."passport_id")
INNER JOIN "vavilov2_integration_accessionpassport" ON ("vavilov2_integration_passport"."passport_id" = "vavilov2_integration_accessionpassport"."passport_id")
INNER JOIN "vavilov2_integration_accession" ON ("vavilov2_integration_accessionpassport"."accession_id" = "vavilov2_integration_accession"."accession_id")
INNER JOIN "vavilov2_integration_rank" ON ("vavilov2_integration_taxon"."rank_id" = "vavilov2_integration_rank"."rank_id")
WHERE "vavilov2_integration_accession"."institute_id" = 2) as TMP
group BY "taxon_name", "name", "taxon_id" ;
Я пытаюсь преобразовать это в выражение Django ORM, но не знаю как.Любое предложение?
Заранее спасибо.