在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那么你需要查询
视频
,并使其“与众不同”```