Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ORM m2m限制为1 models.py 类别Gallerymodels。型号: images=models.ManyToManyFieldImage,null=True,blank=True 类Imagemodels。模型: image=models.ImageField views.py 类别GalleryIndexListView: 模型=画廊_Django_Django Orm - Fatal编程技术网

Django ORM m2m限制为1 models.py 类别Gallerymodels。型号: images=models.ManyToManyFieldImage,null=True,blank=True 类Imagemodels。模型: image=models.ImageField views.py 类别GalleryIndexListView: 模型=画廊

Django ORM m2m限制为1 models.py 类别Gallerymodels。型号: images=models.ManyToManyFieldImage,null=True,blank=True 类Imagemodels。模型: image=models.ImageField views.py 类别GalleryIndexListView: 模型=画廊,django,django-orm,Django,Django Orm,我需要得到每个画廊的缩略图,这是第一个/最后一个/任何图像。 如何将任何库的image作为自定义属性限制为1,以便在不调用第二个SQL查询的情况下不重写gallery.images?多对多作为普通查询集的描述符,因此您可以执行my_gallery.images.all[0]以将查询限制为1。我认为我没有正确理解您要执行的操作,但是下面的代码不适合你吗 class Gallery(models.Model): images = models.ManyToManyField(Image, n

我需要得到每个画廊的缩略图,这是第一个/最后一个/任何图像。
如何将任何库的image作为自定义属性限制为1,以便在不调用第二个SQL查询的情况下不重写gallery.images?

多对多作为普通查询集的描述符,因此您可以执行my_gallery.images.all[0]以将查询限制为1。

我认为我没有正确理解您要执行的操作,但是下面的代码不适合你吗

class Gallery(models.Model):
    images = models.ManyToManyField(Image, null=True, blank=True)

    def get_thumb(self):
        return self.images.all()[0]
或者其他概念:

class Gallery(models.Model):
    images = models.ManyToManyField(Image, null=True, blank=True)
    thumbnail = models.ImageField()

    def save(self, *args, **kwargs):
        self.thumbnail = self.images.all()[0].image

这里需要一些例外捕捉,不过我本应该更好地阅读文档。标准的QuerySet API不能有效地处理这种情况,因为注释为每个父字段生成GROUP BY子句速度很慢,所以我使用了额外的方法和原始子查询

类别GalleryIndexListView: queryset=Gallery.objects.extraselect={'thumb': 选择图像 从应用程序图像、应用程序库图像 哪里 app\u gallery.id=app\u gallery\u images.gallery\u id 和app_gallery_images.image_id=app_image.id 并且app_image.image不为空 限制1 }
这个查询集完全符合我的要求,因为SorlImageField和ImageField只需要文件名就可以表示模板中的缩略图。

我想在单个SQL查询中选择图库和它们的第一个图像作为它们的自定义属性。第一个示例仍然生成1+N查询,其中N是库的数量。第二个例子在我的例子中不存在,因为缩略图选择的自定义逻辑…它甚至不是选择,而是填充图像和图库模型是完全独立和分离的,这就是为什么图像字段可以为空。通过提供queryset=Gallery.objects.prefetch_相关的“图像”,我将SQL查询减少为两个。所有这些都是为了查看类…但仍然是两个查询,而不是一个。这仍然不能解释太多,但我会按照我描述的方式进行解释。最终将Gallery.thumboil更改为thumboil\u image=models.ForeignKeyImage,null=True,剩下的应该是更新数据信号或保存方法,或者缓存是一种方法?这只适用于每个库,但不适用于所有库…我错了吗?