Данные свойств модели с типом отношения "многие ко многим" не отображаются. Где ошибка?

При использовании этого кода, он выдает следующую ошибку:

genres = GamesGenres.objects.annotate(Count('games')))

Не удается подобрать ключевое слово 'games' к полю. Варианты: games_genres, id, name, slug

Если вы используете приведенные выше варианты, то свойство "жанр" модели "Игры" не отображается в браузере в области боковой панели, как предполагалось.

Я хочу, чтобы на панели сайта отображался список жанров игр, по которым можно отфильтровать и выбрать интересующий жанр.

models.py

class Games(models.Model):
    name = models.CharField(max_length=255)
    slug = models.CharField(max_length=255, unique=True, db_index=True)
    content = models.TextField()
    photo = models.ImageField(upload_to="games/%Y/%m/%d/")
    release_date = models.DateField()
    developer = models.CharField(max_length=255)
    publisher = models.CharField(max_length=255)
    trailer = models.URLField()
    genre = models.ManyToManyField("GamesGenres", related_name="games_genres")

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("show_games", kwargs={"games_slug": self.slug})


class GamesGenres(models.Model):
    name = models.CharField(max_length=80)
    slug = models.CharField(max_length=255, unique=True, db_index=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("genres", kwargs={"genre_slug": self.slug})

views.py

class GamesList(GamesMixin, ListView):
    model = Games
    template_name = "main_app/games.html"
    context_object_name = "games"

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        c_def = self.get_user_context(title="Games")
        return dict(list(context.items()) + list(c_def.items()))


class ShowGamesGenres(GamesMixin, ListView):
    model = GamesGenres
    template_name = "main_app/games.html"
    context_object_name = "games"
    allow_empty = False

    def get_queryset(self):
        return Games.objects.filter(genre__slug=self.kwargs["genre_slug"]).select_related('genre')

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        c_def = self.get_user_context(title=str(context["games"][0].genre),
                                      genre_selected=context["games"][0].genre_id)
        return dict(list(context.items()) + list(c_def.items()))

utils.py

class GamesMixin:

    def get_user_context(self, **kwargs):
        context = kwargs
        genres = GamesGenres.objects.annotate(Count('games'))
        context["genres"] = genres
        if "genre_selected" not in context:
            context["genre_selected"] = 0
        return context

urls.py

...
    path('games/', GamesList.as_view(), name="games"),
    path('games/genres/<slug:genre_slug>/', ShowGamesGenres.as_view(), name="genres"),
...

html

{% extends "main_app/base.html" %}

{% block main %}
<tr>
  <td valign="top" class="left-chapters">
    <ul id="leftchapters">
      {% if genre_selected == 0 %}
        <li class="selected">All</li>
      {% else %}
        <li><a href="{% url 'games' %}">All</a></li>
      {% endif %}
      {% for g in genres %}
        {% if g.games__count > 0 %}
          {% if g.pk == genre_selected %}
            <li class="selected">{{ g.name }}</li>
          {% else %}
            <li><a href="{{ g.get_absolute_url }}">{{ g.name }}</a></li>
          {% endif %}
        {% endif %}
      {% endfor %}
    </ul>
  </td>

  <td valign="top" class="content">
    <div class="content-text col-md-10 offset-md-1">
      <h1><b>{{ title }}</b></h1>
      <ul class="list-articles">
        {% for g in games %}
          <div class="card">
            <div class="card-body">
              <li>
                {% if g.photo %}
                  <p><img class="img-article-left thumb" src="{{ g.photo.url }}"></p>
                {% endif %}
                <h2><a class="link-games" href="{{ g.get_absolute_url }}">{{ g.name }}</a></h2>
                <p>Platform: ...</p>
                <p>Genre: {{ g.genre }}</p>
                <p>Realese date: {{ g.release_date|date:"d-m-Y" }}</p>
              </li>
            </div>
          </div>
        {% endfor %}
      </ul>
    </div>
  </td>
</tr>
{% endblock %}

Я не уверен в этом, но думаю, что сообщение об ошибке понятно
. Не удается преобразовать ключевое слово 'games' в поле. Возможные варианты: games_genres, id, name, slug

. вероятно, это произошло из-за использования свойства related_name

. вы можете попробовать использовать это решение

genres = GamesGenres.objects.annotate(Count('games_genres'))
Вернуться на верх