Проблема правильного запроса определенного объекта django

#python #django #django-models #django-views

#python #django #django-модели #django-представления

Вопрос:

В моем (базовом) приложении для фэнтези-футбола, которое я создаю, каждый игрок / позиция представлены отдельным объектом модели. Вот так. Вот одна из таких моделей / позиций.

 class Quarterback(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)  
    name = models.CharField(max_length=20, blank=True)
 

У меня также есть модель «Команда», которая содержит информацию о названии команды, пользователе и игроках в команде. Основная цель этого объекта заключается в том, что я хочу отобразить список всех пользователей и их команд и общий балл их команды, чтобы каждый пользователь мог видеть, как все остальные набирают очки.

 class Team(models.Model):
    team_name = models.CharField(max_length=255, blank=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    quarter_back = models.ForeignKey(Quarterback, on_delete=models.CASCADE, null=True)
    running_back = models.ForeignKey(Runningback, on_delete=models.CASCADE, null=True)
    wide_receiver = models.ForeignKey(Widereceiver, on_delete=models.CASCADE, null=True)
    tight_end = models.ForeignKey(Tightend, on_delete=models.CASCADE, null=True)
    kicker = models.ForeignKey(Kicker, on_delete=models.CASCADE, null=True)
 

Проблема, с которой я сталкиваюсь, заключается в присвоении общего балла. То, что я пытаюсь сделать, это сравнить имена игроков в команде со списком игроков и результатов, которые я извлек из api. Давайте назовем это «player_data». Если игрок в объекте Team находится в объекте player_data, я могу затем присвоить оценку игрока переменной с именем «totalscore», подсчитать ее, отобразить в моем шаблоне и т.д. Но у меня возникли проблемы с запросом отдельного объекта Team.

Моей первой мыслью было создать функцию в views.py и передайте идентификатор объекта команды. Что-то вроде этого.

 def teamscores(request, id):

    team = Team.objects.get(id=id)
 

С таким URL-адресом, как этот.

 path('teamscores/<int:id>', views.teamscores, name="teamscores")
 

Однако я получаю ошибку 404, потому что, похоже, я не могу правильно получить идентификатор объекта. Я думаю, что моя проблема связана с запросом, который я использую, но я действительно не знаю. Я был бы очень признателен за мнение об этом со стороны.

Ответ №1:

попробуйте использовать pk вместо id в вашем запросе и URL

Ответ №2:

Вы можете использовать get_object_or_404 так:

 from django.shortcuts import get_object_or_404
from .models import Team

def teamscores(request, team_id):
  team = get_object_or_404(Team, pk=team_id)
 

или, если вы этого не хотите, вам следует использовать pk :

 team = Team.objects.get(pk=team_id)
 

Вы используете id в своем коде, но это встроенная функция в python, поэтому вы должны изменить ее urls.py и в своем:

 path('teamscores/<int:team_id>', views.teamscores, name="teamscores")
 

Комментарии:

1. Спасибо за ваше предложение. По-прежнему не работает, но если я передам идентификатор объекта вручную в функцию, это сработает.

2. Да, хорошо, не было необходимости в миграции, поскольку в модели не было изменений.

3. Вы попали по правильному URL-адресу? потому что вы говорите, что функция работает нормально, когда вы передаете идентификатор вручную.

4. Но проблема в том, что мне нужно, чтобы он автоматически получал идентификатор. Вводить идентификатор вручную бесполезно. Как функция views может автоматически получать идентификатор всех / любого из моих объектов?

5. id это встроенная функция в python, поэтому вам нужно изменить имя, извините, не видел этого 🙂