У меня есть ряд родственных моделей. Страна -> Лига -> Команда -> Игрок. Модель отлично работает, связывая страну с лигой и лигу с командой, но идентификатор команды отличается, поскольку команды участвуют более чем в одном соревновании. Чтобы справиться с этим, я добавил столбец 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
ИМХО, я думаю, что вы немного ошиблись в дизайне модели. Вы должны сделать отношение команды к лиге как поле многие ко многим. Таким образом, команда может быть назначена в несколько лиг. Если вы хотите поддерживать разные составы для разных турниров, вам следует создать новую модель с именем 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)
Спасатель жизни. Именно то, что я искал. Спасибо!