Фильтрация данных по количеству двух отношений ManyToMany - PullRequest
0 голосов
/ 07 июля 2019

Как фильтровать данные по количеству двух отношений ManyToMany?

class Pic(models.Model):
    size_kb = models.IntegerField(default=0,blank=True)
    md5 = models.CharField(max_length=128,blank=True)

class Film(models.Model):
    content = models.CharField(max_length=4096, null=True, blank=True)
    duration = models.SmallIntegerField(null=True, blank=True)

class Video(models.Model):
    md5 = models.CharField(max_length=32,blank=True)
    rating = models.FloatField(null=True,blank=True)
    year = models.SmallIntegerField(null=True,blank=True)

class Person(models.Model):
    pics = models.ManyToManyField(Pic,related_name='persons')
    videos = models.ManyToManyField(Video,related_name='persons')
    films = models.ManyToManyField(Film, related_name='persons')

Поиск лиц с 10 - 20 фото:

Person.objects.all().annotate(seek_col=Count('Pic')).filter(seek_col__range=(10,20))

Результат в порядке ...

Поиск лиц с 10 - 20 фильмами:

Person.objects.all().annotate(seek_col=Count('Film')).filter(seek_col__range=(10,20))

Результат в порядке ...

Поиск лиц с 10 - 20 фильмами и 10 - 20 фото:

Я пробую следующие утверждения:

Person.objects.all().annotate(fcol=Count('films')).filter(fcol__range=(10,20)).annotate(pcol=Count('pics').filter(pcol__range=(10,20))
Person.objects.all().annotate(fcol=Count('films')).filter( pcol=Count('pics')).filter(fcol__range=(10,20), pcol__range=(10,20))

Результат бессмысленен ... не совсем бессмысленен: Я ожидаю следующих результатов (только столбцы с фотографиями и фильмами):

| фото | фильмы |

| 20 | 20 |

| 10 | 20 |

| 14 | 15 |

| 10 | 12 |

| 16 | 13 |

| 12 | 17 |

но я получаю эти результаты (зависит от диапазона):

| фото | фильмы |

| 20 | 1 |

| 1 | 20 |

| 4 | 5 |

| 10 | 2 |

| 6 | 3 |

| 2 | 7 |

Я пробовал это 100 раз ... нет ожидаемого результата! Но если вы умножаете первое на второе число, результат никогда не будет выше максимального значения диапазона !! ... действительно таинственный (: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...