Как получить идентификатор, используя get_context_data? - PullRequest
1 голос
/ 09 июня 2019

Я хотел бы получить общее количество подписчиков, прикрепленных к моделям, использующим в моделях:

class Project(models.Model):
    owner = models.ForeignKey(User, related_name='project_created_by', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=150, blank=True, null=True)
    followers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='followers', blank=True)
    created = models.DateTimeField(auto_now_add=True)
    last_modefied = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

Вот класс

class ProjectListView(ListView):
    template_name = 'projectmanagement/project.html'
    context_object_name = 'projects'

    def get_queryset(self):
        queryset = Project.objects.filter(owner=self.request.user).order_by("name")
        return queryset

    def get_context_data(self, *args, **kwargs):
        context = super(ProjectListView, self).get_context_data(*args, **kwargs)
        project = Project.objects.get(pk=12) <-- HERE -->
        context['followers'] = project.followers.filter(followers=project).count()
        return context

1 Ответ

1 голос
/ 09 июня 2019

Вы можете .annotate(..) [Django-doc] набор запросов вашего Product с количеством подписчиков:

from django.db.models import <b>Count</b>

class ProjectListView(ListView):
    model = Project
    template_name = 'projectmanagement/project.html'
    context_object_name = 'projects'

    def get_queryset(self):
        return super().get_queryset().annotate(
            <b>nfollowers=Count('followers')</b>
        ).filter(
            owner=self.request.user
        ).order_by('name')

Теперь все проектыв контексте данные будут иметь дополнительный атрибут nfollowers с количеством подписчиков.

Таким образом, вы можете отобразить это, например, с помощью:

{% for project in projects %}
    {{ project.name }}, followers: {{ <b>project.nfollowers</b> }}<br>
{% endfor %}
...