У меня есть 2 модели:
class Tag(models.Model):
name = models.CharField(max_length=255, null=True, blank=True)
...
class Video(models.Model):
tags = models.ManyToManyField('home.Tag', blank=True, related_name='tags')
thumbnail_link = models.CharField(max_length=255, null=True, blank=True)
...
В списке Video
я хочу получить 15 случайных тегов, поэтому я использую этот код:
class VideoListView(generic.ListView):
model = Video
context_object_name = 'video_list'
template_name = 'pages/home.html'
paginate_by = 12
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tags = Tag.objects.all().order_by('?')[0:15]
context['tags'] = tags
return context
Пока хорошо, я могу перебрать 15 тегов в моем шаблоне.
{% for entry in tags %}
{{ entry.name }}
{% endfor %}
Но сейчас я хочу получить 1 случайное thumbnail_link
связанного видео определенного тега в моем для l oop.
Что работает так:
{% for entry in tags %}
{% for image in entry.tags.all %}
{% if forloop.first %}
{{ image.thumbnail_link }}
{% endif %}
{% endfor %}
{% endfor %}
Но я чувствую, что это очень неэффективно для базы данных, потому что вы генерируете дополнительный для l oop в al oop, и вы получаете слишком много ненужных данных. Кроме того, это слишком много шаблонных логи c, я бы предпочел переместить это в представление.
Какой самый эффективный способ для дБ получить thumbnail_link
одного случайного Video
, который связан с Tag
, который зацикливается?