Джанго: Подсчет в схеме таблицы «многие ко многим» - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу вычислить некоторые статистические данные в моем приложении 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, но не знаю как.Любое предложение?

Заранее спасибо.

...