Python Can';t在ModelAdmin中重写queryset()
我有以下模型,它们描述了具有可选数量图像的绘画:Python Can';t在ModelAdmin中重写queryset(),python,django,Python,Django,我有以下模型,它们描述了具有可选数量图像的绘画: class Painting(Base, Seo, Timestamp): artist = models.ForeignKey(Artist, related_name='paintings') medium = models.ForeignKey(Medium) def thumbnail(self): thumbnail = self.images.filter(position=0)
class Painting(Base, Seo, Timestamp):
artist = models.ForeignKey(Artist, related_name='paintings')
medium = models.ForeignKey(Medium)
def thumbnail(self):
thumbnail = self.images.filter(position=0)
if thumbnail.exists():
return thumbnail[0].thumbnail_html()
else:
return ''
thumbnail.allow_tags = True
class PaintingImage(models.Model):
painting = models.ForeignKey(Painting, related_name='images')
alt = models.CharField(max_length=100)
position = models.PositiveSmallIntegerField("Position", default=0)
# use pi.image = 'path/to/file' for direct access to the underlying image filename
image = models.ImageField(upload_to='paintings')
thumbnail = models.ImageField(upload_to='paintings')
这一切都很好,但是管理列表视图速度很慢,并且执行了大量查询,因为它在绘制时调用了thumbnail(),这是对每个绘制的PaintingImage执行单独的查询
我试图在ModelAdmin中重写queryset(),以高效的方式手动将映像附加到每个实例列表显示中的缩略图现在指向PaintingAdmin中的缩略图(self,obj),该缩略图读取存储的属性,但不起作用-无法在下面的缩略图(self,obj)中读取obj.thumb:
我使用的是django 1.5.2和python 2.7。您可以使用与反向关系相关的预取,因此queryset()中的上述代码可以替换为:
paintings = super(PaintingAdmin, self).queryset(request)
return paintings.prefetch_related('images')
问题在于这种绘画方法:
def thumbnail(self):
thumbnail = self.images.filter(position=0)
if thumbnail.exists():
return thumbnail[0].thumbnail_html()
else:
return ''
即使在使用预取_相关时,它也会执行额外的查询。因此,解决方案是将其替换为:
def thumbnail(self):
if self.images.count():
return self.images.all()[0].thumbnail_html()
else:
return ''
签出
select\u related()
它对反向外键不起作用,管理员默认使用它,然后使用prefetch\u related()
。这对外键也不起作用。即使这样做了,真正的问题是在queryset()中向queryset添加东西是不起作用的,它确实起作用了。您需要添加预取相关('images')
。看这个。我会先解决这个问题,然后集中精力解决另一个问题。看起来他们没有关系。
def thumbnail(self):
if self.images.count():
return self.images.all()[0].thumbnail_html()
else:
return ''