Вывод всех данных из БД.

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Django.
Моя модель сохраняет голоса и самого проголосовавшего пользователя. На главной странице отображаются результаты текущего юзера(voter=request.user), однако я хочу, чтобы выводились результаты всех пользователей. Как мне это сделать?

views.py:
ради показа хоть какого-то результата я оставил вывод текущего пользователя.
Python:
def black(request):
    if request.user.is_authenticated:
        value, created = Choose.objects.get_or_create(voter=request.user)

        if request.method == 'POST':
            select_action = request.POST['choose']

            if select_action == 'black':
                value.count_black += 1
                value.save()
            else:
                return render(request, 'registration/black.html', {"value": value})

            return redirect("home")

models.py:
Python:
from django.db import models
from django.contrib.auth.models import User


class Choose(models.Model):
    count_black = models.PositiveIntegerField(default=0, verbose_name="black")
    count_white = models.PositiveIntegerField(default=0, verbose_name="white")
    count_purple = models.PositiveIntegerField(default=0, verbose_name="purple")
    voter = models.ForeignKey(User, null=True, blank=True, verbose_name='Пользователь', on_delete=models.PROTECT)
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можете подсказать, что мне делать, если мне нужно обратиться к полям модели для вывода процентов?
Проценты можно посчитать с помощью сумм, которые вы уже посчитали:
Python:
def home(request):
        # получаем все голоса и получаем их сумму.
        value = Choose.objects.all()
        sum_black = Choose.objects.aggregate(Sum('count_black'))
        sum_white = Choose.objects.aggregate(Sum('count_white'))
        sum_purple = Choose.objects.aggregate(Sum('count_purple'))
        
        # выводим процентный подсчет
        # all = value.count_black + value.count_white + value.count_purple
        # общая сумма
        all = sum_black['count_black__sum'] + sum_white['count_white__sum'] + sum_purple['count_purple__sum']
        # percent_black = int(value.count_black * 100 / all)
        # percent_white = int(value.count_white * 100 / all)
        # percent_purple = int(value.count_purple * 100 / all)
        percent_black = int(sum_black['count_black__sum'] * 100 / all)
        percent_white = int(sum_white['count_white__sum'] * 100 / all)
        percent_purple = int(sum_purple['count_purple__sum'] * 100 / all)

        context = {
            "value": value,
            "sum_black": sum_black,
            "sum_white": sum_white,
            "sum_purple": sum_purple,
            "percent_black": percent_black,
            "percent_white": percent_white,
            "percent_purple": percent_purple
        }

        return render(request, 'registration/home.html', context)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
На главной странице отображаются результаты текущего юзера(voter=request.user), однако я хочу, чтобы выводились результаты всех пользователей. Как мне это сделать?
Получить все объекты Choose и вывести их в шаблоне:
Python:
def black(request):
    if request.user.is_authenticated:
        value, created = Choose.objects.get_or_create(voter=request.user)
        values = Choose.objects.all()

        if request.method == 'POST':
            select_action = request.POST['choose']

            if select_action == 'black':
                value.count_black += 1
                value.save()
            else:
                return render(request, 'registration/black.html', {"value": value, "values": values})

            return redirect("home")
в шаблоне можно просто вывести в цикле:
HTML:
{%for v in values%}
<p>{{v.voter}} - {{v.count_black}}</p>
{% endfor %}
 

Domohod45

Новичок
Пользователь
Дек 7, 2021
68
3
8
Получить все объекты Choose и вывести их в шаблоне:
Python:
def black(request):
    if request.user.is_authenticated:
        value, created = Choose.objects.get_or_create(voter=request.user)
        values = Choose.objects.all()

        if request.method == 'POST':
            select_action = request.POST['choose']

            if select_action == 'black':
                value.count_black += 1
                value.save()
            else:
                return render(request, 'registration/black.html', {"value": value, "values": values})

            return redirect("home")
в шаблоне можно просто вывести в цикле:
HTML:
{%for v in values%}
<p>{{v.voter}} - {{v.count_black}}</p>
{% endfor %}
Спасибо, я уже решил эту проблему, но тут возникла новая.
моя views сейчас:
Python:
def home(request):
        # получаем все голоса и получаем их сумму.
        value = Choose.objects.all()
        sum_black = Choose.objects.aggregate(Sum('count_black'))
        sum_white = Choose.objects.aggregate(Sum('count_white'))
        sum_purple = Choose.objects.aggregate(Sum('count_purple'))
       
        # выводим процентный подсчет (ошибка)
        all = value.count_black + value.count_white + value.count_purple
        percent_black = int(value.count_black * 100 / all)
        percent_white = int(value.count_white * 100 / all)
        percent_purple = int(value.count_purple * 100 / all)

        context = {
            "value": value,
            "sum_black": sum_black,
            "sum_white": sum_white,
            "sum_purple": sum_purple,
            "percent_black": percent_black,
            "percent_white": percent_white,
            "percent_purple": percent_purple
        }

        return render(request, 'registration/home.html', context)

Проблема с процентами. Эта логика работает, но c objects.all() видимо нельзя обратится к конкретным моделям. Из-за чего ошибка:
Python:
AttributeError at / 'QuerySet' object has no attribute 'count_black'
Можете подсказать, что мне делать, если мне нужно обратиться к полям модели для вывода процентов?
 

Форум IT Специалистов