Почему я не могу получить префетчированный связанный объект в DJANGO?
Я хочу получить midia с thumbnail = True для каждой галереи, используя prefetch related.
class Midia(Base):
galeria = models.ForeignKey(Galeria, on_delete=models.CASCADE, related_name= "midias")
thumbnail = models.BooleanField('Thumbnail ', default=False)
video_thumbnail = models.URLField(blank = True)
imagem = StdImageField(upload_to='midias/', blank=True, delete_orphans=True)
class Galeria(Base):
titulo = models.CharField('Título', max_length=100)
descricao = models.TextField('Descrição', blank= True)
Я сделал это с помощью этого кода в представлении:
galerias = Galeria.objects.prefetch_related(Prefetch('midias', queryset= Midia.objects.filter(thumbnail = True))).all()
А это в HTML:
{% for galeria in galerias %}
{% with thumbnail=galeria.midias.first %}
{% if thumbnail %}
{% if thumbnail.imagem %}
<img src="{{ thumbnail.imagem.url }}" alt="" >
{% else %}
<img src="{{ thumbnail.video_thumbnail }}" alt="">
{% endif %}
{% else %}
<img src="generic image" alt="" >
{% endif %}
{% endwith %}
Но почему когда я пытаюсь сделать это:
{% with thumbnail=galeria.midias %}
Возвращает None. При проверке sqls hits в базе данных galeria.midias.first не появляется (prefetch работает и возвращает только midia с thumbnail = True). Почему при использовании galeria.midias возвращается None?
Потому что midias - это queryset. А не объект. Поэтому вы должны выполнить итерацию по нему.
{% for galeria in galerias %}
{% for thumbnail in galeria.midias.all %}
{% if thumbnail %}
{% if thumbnail.imagem %}
<img src="{{ thumbnail.imagem.url }}" alt="" >
{% else %}
<img src="{{ thumbnail.video_thumbnail }}" alt="">
{% endif %}
{% else %}
<img src="generic image" alt="" >
{% endif %}
{% endfor %}
{% endfor %}