В Django / Python я связываю объект (A) с двумя экземплярами другого объекта (B), так что если я вызываю B.A_set.all (), он работает для любого экземпляра B - PullRequest
0 голосов
/ 03 мая 2019

РЕДАКТИРОВАТЬ: Предоставленное решение работает!

Я написал модифицированную рейтинговую систему ELO для FIFA.Я хочу показать таблицу лидеров ELO с игроками (я могу это сделать), показать историю игр, а также иметь возможность выбрать игрока и просмотреть его личную историю игр.Моя предполагаемая версия занятий представлена ​​ниже.Я могу создать таблицу лидеров и историю игр, если я установлю атрибут player1 и player2 для Game в строку и определю имя вручную, но хочу, чтобы игра и игроки были связаны.

Когда я пытаюсь перенести это решениев mySQL это сообщение об ошибке

ERRORS:
blog.Game.player1: (fields.E304) Reverse accessor for 'Game.player1' clashes with reverse accessor for 'Game.player2'.
    HINT: Add or change a related_name argument to the definition for 'Game.player1' or 'Game.player2'.
blog.Game.player2: (fields.E304) Reverse accessor for 'Game.player2' clashes with reverse accessor for 'Game.player1'.
    HINT: Add or change a related_name argument to the definition for 'Game.player2' or 'Game.player1'.

Models.py в папке django

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Player(models.Model):
    name = models.CharField(max_length=100)
    elo = models.IntegerField()
    date_added = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return str(self.name) + " = " + str(self.elo) + " - Joined " +
                    str(date_add)
class Game(models.Model):
    date_played = models.DateTimeField(default=timezone.now)
    player1 = models.ForeignKey(Player,on_delete=models.CASCADE)
    p1goal = models.IntegerField()
    player2 = models.CharField(max_length=100)
    p2goal = models.ForeignKey(Player,on_delete=models.CASCADE)

    def __str__(self):
        return str(self.date_played) + " - " + str(self.player1.name) + " " + str(self.p1goal) + " to " + \
               str(self.p2goal) + str(self.player2.name)

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Я заметил, что атрибут "name" вашей модели игрока не установлен в качестве первичного ключа модели.Возможно, вам нужно получить доступ к каждому экземпляру игрока с его первичным ключом.Прямо сейчас этим первичным ключом будет число, соответствующее каждому игроку в том порядке, в котором они были добавлены.

0 голосов
/ 03 мая 2019

Вы пытаетесь использовать модель Player дважды. Это приводит к дублированию в reverse relations. Если вам вообще не нужны обратные отношения, используйте related_name = +.

.
player1 = models.ForeignKey(Player,on_delete=models.CASCADE, related_name="+")

or

p2goal = models.ForeignKey(Player,on_delete=models.CASCADE, related_name="+")

для получения дополнительной информации обратная связь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...