Проблема с назначением внешнего ключа Django - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть серия родственных моделей.Страна -> Лига -> Команда -> Игрок.Модель отлично работает, связывая страну с лигой и лигу с командой, но идентификатор команды отличается, так как команды играют более чем в одном соревновании.Чтобы справиться с этим, я добавил столбец ref с идентификатором для каждой команды.Я хотел бы использовать этот столбец ref в качестве внешнего ключа в моей модели проигрывателя, но я получаю ошибки, когда пытаюсь проанализировать данные в базе данных Postgres.

Я пытался использовать to_field и unique = Trueно все равно в конечном итоге с ошибкой.Я осмотрелся вокруг, но пока не нашел решения.

Вот код моей модели:

from django.conf import settings
from django.db import models
from django.utils import timezone
import datetime


class Country(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=50,default="TBA")
    id = models.IntegerField(primary_key=True,default=0)


    def __str__(self):
        return self.name

    def __unicode__(self):
        return u'%s' % self.name

class League(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=100,default="TBA")
    id = models.IntegerField(primary_key=True,default=0)
    country = models.ForeignKey(Country,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    def __unicode__(self):
        return u'%s' % self.name


class Team(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=100,default="TBA")
    id = models.IntegerField(primary_key=True,default=0)          
    league = models.ForeignKey(League,on_delete=models.CASCADE)
    ref = models.IntegerField(default=0)

    def __str__(self):
        return self.name

    def __unicode__(self):
        return u'%s' % self.name

class Player(models.Model):
    objects = models.Manager()
    name = models.CharField(max_length=64)
    id = models.IntegerField(primary_key=True)
    first_name = models.CharField(max_length=64,default="Unknown")
    last_name = models.CharField(max_length=64,default="Unknown")
    nationality = models.CharField(max_length=64,default="Unknown")
    date_of_birth = models.DateField(default = datetime.date.today)
    position = models.CharField(max_length=64, default="Unknown")
    team_ref =models.ForeignKey(Team,to_field="ref",on_delete=models.CASCADE)

    def __str__(self):
        return self.name

1 Ответ

0 голосов
/ 08 апреля 2019

ИМХО, я думаю, что ваш дизайн модели немного неправильный. Вы должны установить отношение между Командой и Лигой как ManyToMany Поле. Таким образом, команда может быть назначена на несколько лиг. Если вы хотите сохранить разные отряды для разных турниров, то вам следует создать новую модель с именем Squads и использовать ее от до , а также связать эту модель от многих игроков из Player. Например:

class Team(models.Model):
   # other fields

   league = models.ManyToManyField(League, through="Squad")

class Squad(models.Model):
   team = models.ForeignKey(Team)
   league = models.ForeignKey(League)


class Player(models.Model):
   squad = models.ManyToManyField(Squad)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...