筛选超过两个ManyToMany关系的数据

时间:2019-07-06 21:38:53

标签: python django filter annotations

通过两个ManyToMany-relations的计数过滤数据的方法是什么?

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次...没有预期的结果! 但是,如果将第一个数字乘以第二个数字,则结果永远不会高于范围的最大值! ...真的很神秘(:-)

0 个答案:

没有答案