Наиболее эффективный способ БД для получения одного поля случайного отношения ManyToManyField в Django - PullRequest
0 голосов
/ 13 марта 2020

У меня есть 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, который зацикливается?

1 Ответ

0 голосов
/ 13 марта 2020

Tag.objects.prefetch_related('tags').order_by('?')[:15]

Проверьте здесь https://docs.djangoproject.com/en/3.0/ref/models/querysets/#prefetch -связанные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...