我有一个画廊模型和一个照片模型。在我的照片模型中,我有一个布尔字段,用于选择图库缩略图。
class Gallery(models.Model):
title = models.CharField(max_length=500, verbose_name="Tittel")
class Photo(models.Model):
gallery = models.ForeignKey(Gallery, null=True, blank=True)
image = ImageField(upload_to='uploads')
frontpage_thumb = models.BooleanField(default=False)
这是我现在使用的代码,但这不是最好的方法:
{% for object in gallery_list %}
<div class="post">
{% for thumbnail in object.photo_set.all %}
{% if thumbnail.frontpage_thumb %}<img src="{{MEDIA_URL}}{{ thumbnail.image }}">{% endif %}
{% endfor %}
</div>
{% endfor %}
任何人都有更好的方法吗?
答案 0 :(得分:1)
您可以使用自定义Manager
和QuerySet
,如下所示:
class PhotoQuerySet(models.query.QuerySet):
def frontpage_thumb(self):
return self.filter(frontpage_thumb=True)
class PhotoManager(models.Manager):
use_for_related_fields = True
def get_queryset(self):
return PhotoQuerySet(self.model)
class Photo(models.Model):
# ...
objects = PhotoManager()
然后你可以做以下事情:
# get first thumb for a gallery:
>>> g = Gallery.objects.all()[0]
>>> thumb = g.photo_set.all().frontpage_thumb()[0]
# or all thumbs for all galleries:
>>> all_thumbs = Photo.objects.all().frontpage_thumb()
由于您的架构不能保证每Photo
个Gallery
设置为frontpage_thumb=True
,因此您仍然需要在模板中获取结果的第一个元素, .0
,就像上面的第一个Python示例一样:
{% for gallery in gallery_list %}
<img src="{{ gallery.photo_set.all.frontpage_thumb.0.image.url }}">
{% endfor %}