在Django中检索随机多域关系的一个域的最有效方法
我有以下两种型号:在Django中检索随机多域关系的一个域的最有效方法,django,django-views,django-templates,Django,Django Views,Django Templates,我有以下两种型号: 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.CharF
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
listview中,我想得到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 %}
但是我现在想做的是在我的for循环中获得一个特定标记的相关视频的随机缩略图链接
有效的方法是:
{% for entry in tags %}
{% for image in entry.tags.all %}
{% if forloop.first %}
{{ image.thumbnail_link }}
{% endif %}
{% endfor %}
{% endfor %}
但是我觉得这对于数据库来说是非常不有效的,因为在循环中生成了一个额外的for循环,并且检索了太多不必要的数据。另外,它有太多的模板逻辑,我宁愿移动到视图
获取一个随机视频的缩略图链接
最有效的方法是什么?该链接与正在循环的标记
有关。Tag.objects.prefetch_related('tags')。order_by('?')[:15]
在这里查看很好,谢谢!但在第二个循环中,每次循环Tag
时,仍然有15个Video
项目和所有相关字段。但我只需要缩略图链接
和一个随机条目。没有其他方法可以做到这一点吗?@RafRasenberg那么你需要查询视频
,并使其“与众不同”```