Django - аннотация не отображается в шаблоне - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь получить аннотации, отображаемые в моих шаблонах.У меня есть две модели (model1 и model2), и я хочу показать количество model2, связанных с model1.

Вот мои views.py:

def model2_count(request, pk):
    model2count = models.Model1.objects.filter(pk=model1.pk).annotate(title_count=Count(‘model2__title'))
    return render(request, 'model1/_model1.html', {‘m2c’: model2count})

Вот шаблон (model1/_model1.html):

Я попробовал это:

{% for object in m2c %}</h3>
    {{ object.title }}
    {{ object.title_count }}
{% endfor %}

И попробовал это:

{% if m2c.title_count %}
    {{ m2c.title_count }}
{% endif %}

Я дергал себя за это дляпару дней и не могу понять это.Следующее в значительной степени бесполезно:

Что расстраивает, что я могу 'Я даже не говорю , почему применение этих решений не работает.

Любой вклад приветствуется.

Также, вот мои модели со всеми убранными БС.

class Publication(models.Model):
    title = models.CharField(max_length=150, unique=False, blank=False)
    contributors_note = models.TextField(max_length=300, blank=False)
    website = models.URLField()
    publisher = models.CharField(max_length=250, unique=False)
    publication_date = models.DateField(default=datetime.date.today)
    slug = models.SlugField(allow_unicode=True, unique=False)

    content_type = models.CharField(max_length=100, unique=False)# In this field user's define the type of content (blog, newspaper article, publication etc)
    research_type = models.CharField(max_length=100, unique=False)# In this field user's define whether the research is based on primary or secondary research
    user = models.ForeignKey(Current_user, related_name="publication")
    created_at = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)
    category = models.ForeignKey(Category, related_name="publication",null=True, blank=False)

    comment = models.TextField()


    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse(
            "publication:single",
            kwargs={
                "username": self.user.username,
                "pk": self.pk
            }
        )

    class Meta:
        ordering = ["-created_at"]


class Assessment(models.Model):
    title = models.CharField(max_length=150, unique=False, blank=False)
    publication = models.ForeignKey('publication.Publication', on_delete=models.CASCADE, related_name='assessment')
    analyst = models.ForeignKey(Current_user, null=True, blank=True, related_name="assessment")
    created_at = models.DateTimeField(auto_now_add=True)
    approved_comment = models.BooleanField(default=False)


    key_finding1 = models.TextField(max_length=300)
    key_finding2 = models.TextField(max_length=300)
    key_finding3 = models.TextField(max_length=300)

    ratings_range = (
    ('1', 'Very Weak'),
    ('2', 'Weak'),
    ('3', 'Moderate'),
    ('4', 'Strong'),
    ('5', 'Very Strong'),
    )

    content_rating_1 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_1_comment = models.TextField(max_length=300)
    content_rating_2 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_2_comment = models.TextField(max_length=300)
    content_rating_3 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_3_comment = models.TextField(max_length=300)
    content_rating_4 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_4_comment = models.TextField(max_length=300)
    content_rating_5 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_5_comment = models.TextField(max_length=300)

    source_rating_1 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_1_comment = models.TextField(max_length=300)
    source_rating_2 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_2_comment = models.TextField(max_length=300)
    source_rating_3 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_3_comment = models.TextField(max_length=300)
    source_rating_4 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_4_comment = models.TextField(max_length=300)
    source_rating_5 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_5_comment = models.TextField(max_length=300)


    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-created_at"]

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Плохая ошибка с моей стороны. Решение, приведенное выше, сработало. Вот мой окончательный код:

views.py

class PublicationDetail(SelectRelatedMixin, generic.DetailView):
model = models.Publication
select_related = ("category", "user")

def get_queryset(self):
    queryset = super().get_queryset()
    return queryset.filter(user__username__iexact=self.kwargs.get("username")).annotate(assessment_count=Count('assessment'))

Следующие ребята: - Людям, которые хотят помочь вам (и вам быстрее), легче, если вы просто публикуете свой оригинальный код, а не пытаетесь стать умнее. Не смущайся. Я бы спас нас все время, если бы только что сделал это.

0 голосов
/ 15 сентября 2018

Первые агрегации выполняются только с использованием имени поля, т.е. model2, а не model2__title

Далее получаем количество аннотированных столбцов, которые рекомендуется использовать .values или values_list, но не обязательно.

https://docs.djangoproject.com/es/2.1/topics/db/aggregation/#cheat-sheet

model1 = Model1.objects.get(pk=model1.pk)
model2count = (
    Model1.objects.annotate(count=Count('model2'))
       .filter(pk=model1.pk)
       .values_list('title', 'count', named=True)
)

template.html

{% for object in model2count %}
    {{ object.title }}
    {{ object.count }}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...