我有一个模型,其中包含一个用户,每个用户都关联到一个俱乐部,一个俱乐部可以包含许多球队,球场等。我想知道我应该如何设计我的模型,以便我可以显示/编辑球队/球场的信息基于用户登录和俱乐部关联到该用户。我的ClubInfo模型包含一个与用户相关联的外键,其中与我的其他模型(团队/球场)一样,外键与ClubInfo而不是用户相关联。你知道吗
class ClubInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
club_name = models.CharField(max_length=50, default='')
club_logo = models.ImageField(upload_to='profile_pics', blank=True)
club_address1 = models.CharField(max_length=30)
club_address2 = models.CharField(max_length=30, default='')
club_address3 = models.CharField(max_length=30, default='')
club_town = models.CharField(max_length=30)
club_county = models.CharField(max_length=30)
club_country = models.CharField(max_length=30)
def __str__(self):
return self.club_name
class Player(models.Model):
club_name = models.ForeignKey(ClubInfo, to_field='id', on_delete=models.CASCADE, unique=True)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
dob = models.DateField(max_length=8)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=12)
mobile = models.CharField(max_length=15)
emergency_contact_name = models.CharField(max_length=40)
emergency_contact_mobile = models.CharField(max_length=15)
address1 = models.CharField(max_length=30)
address2 = models.CharField(max_length=30, default='')
address3 = models.CharField(max_length=30, default='')
town = models.CharField(max_length=30)
county = models.CharField(max_length=30)
country = models.CharField(max_length=30)
def __str__(self):
return "%s %s" % (self.first_name, self.last_name)
class Team(models.Model):
club_name = models.ForeignKey(ClubInfo, to_field='id', on_delete=models.CASCADE, unique=True)
team_name = models.CharField(max_length=30)
manager_name = models.CharField(max_length=20)
player_pk = models.ForeignKey(Player, to_field='id', on_delete=models.CASCADE, unique=True)
def __str__(self):
return self.team_name
class Pitch(models.Model):
club_name = models.ForeignKey(ClubInfo, to_field='id', on_delete=models.CASCADE, unique=True)
pitch_name = models.CharField(max_length=30)
PITCH_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
PITCH_TYPE = (
('1', 'Outdoor'),
('2', 'Indoor'),
)
pitch_size = models.CharField(max_length=1, choices=PITCH_SIZES)
pitch_type = models.CharField(max_length=1, choices=PITCH_TYPE)
open_time = models.TimeField(default='09:00')
close_time = models.TimeField(default='22:00')
def __str__(self):
return self.pitch_name
那么您可能不想在外键中使用
unique=True
, 因为行为与OneToOneField
非常相似。那就意味着 每个俱乐部只能有一个球员,一个球场等请参考: What's the difference between django OneToOneField and ForeignKey?
to_field='id'
,它是to_field
参数的默认值https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.to_field
您需要定义反向关系: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name
例如:
然后您可以通过以下方式查询球员的投球:
unique=True
之后),团队可以由 只有一个球员,球员可以在许多球队。这是预期的吗? 很可能你想要1)有许多参与者的团队-然后需要在
Player
模型中向Team
添加外键2)有许多球员的团队,但球员也可以在许多团队中-然后你希望有一个多对多的关系: https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/
club_name
作为外键是一种错误的命名约定—它不指向club_name
,而是指向Club
对象相关问题 更多 >
编程相关推荐