Python Django:检索至少包含一张公共照片的所有图库

Python Django:检索至少包含一张公共照片的所有图库,python,sql,django,django-models,count,Python,Sql,Django,Django Models,Count,请原谅我的英语不好 想象一下这些非常简单的模型: class Photo(models.Model): is_public = models.BooleanField('Public', default=False) class Gallery(models.Model): photos = models.ManyToManyField('Photos', related_name='galleries', null=True, blank=True) 我需要选择至少包含一张

请原谅我的英语不好

想象一下这些非常简单的模型:

class Photo(models.Model):
    is_public = models.BooleanField('Public', default=False)

class Gallery(models.Model):
    photos = models.ManyToManyField('Photos', related_name='galleries', null=True, blank=True)
我需要选择至少包含一张公共照片的所有
Gallery
实例(如果可能,还需要添加包含公共照片数量的
photos\uu count
属性)

我尝试了以下查询:

Gallery.objects.all()\
    .annotate(Count('photos'))\
    .filter(photos__is_public=True)
看起来还可以,但是: -这个问题很奇怪 -每个库中添加的属性
photos\u count
将包含此库中的照片总数,而不是此库中的公共照片数

我想我需要的硬编码sql查询是:

SELECT `gallery`.* , COUNT(`gallery_photos`.`photo_id`) 
FROM `gallery` 
    INNER JOIN `gallery_photos` ON (`gallery`.`id` = `gallery_photos`.`gallery_id`) 
    INNER JOIN `photo` ON (`gallery_photos`.`photo_id` = `photo`.`id`) 
WHERE `photo`.`is_public` = True 
GROUP BY gallery.id ;
有什么好办法吗

谢谢!;-)

这应该可以做到:

编辑,更新以添加计数:

SELECT `gallery`.*, 'a'.'count' 
FROM `gallery` 
inner join (
    select `gallery`.`id`, count(*) as count
    from `gallery_photos` 
    INNER JOIN `photo` ON (`gallery_photos`.`photo_id` = `photo`.`id`) 
    where `photo`.`is_public` = True
    group by `gallery`.`id`
) a on `gallery`.`id` = 'a'.'id'
WHERE `photo`.`is_public` = True 
我会尝试:

Gallery.objects.filter(photos__is_public=True).annotate(Count('photos'))
我相信你只是把你的过滤器排序搞错了,但我还没有建立你的模型来测试这个假设

试试第二个:

Gallery.objects.exclude(photos__is_public=False).annotate(Count('photos'))
这应该排除所有照片都不公开的画廊,并返回哪些是公开的,哪些不是公开的

Gallery.objects.filter(photos__is_public=True)\ .annotate(Count('photos__is_public')) Gallery.objects.filter(照片\u是\u public=True)\ .annotate(计数(“照片是公开的”)
django文档位于

根据我的经验,以下问题:

Gallery.objects.filter(photos__is_public=True).annotate(Count('photos'))
将为您的图库提供至少一张公开的照片,并且只提供一些公开的照片。唯一的问题是,它将排除没有公共照片的画廊,但听起来你并不在乎。您是否测试过上述查询

如果它仍然没有返回正确的数据,那么annotate可能会改变返回的数据,因为它只返回所有都是公共的库。在这种情况下,您可以使用“extra”方法来获得所需的计数

Gallery.objects.filter(photos__is_public=True).extra(select={
  "photo_count": """
  SELECT COUNT(`gallery_photos.id`)
      FROM `gallery_photos`
  WHERE `gallery_photos.gallery_id` `gallery.id AND
        `gallery_photos.is_public = True
  """})

Jason Christa的排除方法也可能起作用。

Hi,这不起作用,因为它选择了所有照片都是公开的画廊。但我需要选择至少有一张照片是公开的画廊。此外,您的
phots\u count
属性将包含所有照片的数量(公共和非公共)。还是谢谢你帮助我;-)!看来你的查询有两个选择,我的一个。因此,我认为我的查询操作系统更加优化pHa,Jason的查询集是正确的,而且更短,我想。真遗憾,我在这里输入了更多的键=],现在需要睡觉了。。。筛选器应用于联接的内部表的行,只剩下w/is\u public=True行并对其进行计数。此操作:
Gallery.objects.filter(photos\uu is\u public=True)。annotate(Count('photos'))
非常感谢您(您的查询也可以工作;)。