python - 如何从链接到另一个模型的外键访问模型字段?
问题描述
我有一个包含一个用户的模型,每个用户都与一个俱乐部相关联,一个俱乐部可以包含许多球队、球场等。我想知道我应该如何设计我的模型,以便我可以显示/编辑基于球队/球场的信息在登录的用户和与该用户关联的俱乐部上。我的 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
. 这意味着每个俱乐部只能有一名球员、一个球场等。
请参考: django OneToOneField 和 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
例如:
class Pitch(models.Model):
club_name = models.ForeignKey(ClubInfo, on_delete=models.CASCADE, related_name="pitches")
(...)
然后您可以通过以下方式查询球员的球场:
player = Player.objects.get(<get your player>).club_name.pitches
- 在您当前的设计中(移除 a 后
unique=True
),一个团队只能由一名玩家组成,并且玩家可以在多个团队中。这是预期的吗?您很可能希望拥有
1) 有很多玩家的团队 - 然后你需要Team
在Player
模型中添加外键
2)有很多球员的球队,但球员也可以在很多球队 - 然后你想有一个多对多的关系: https ://docs.djangoproject.com/en/dev/topics/db/examples/多对多/
club_name
作为外键是一个不好的命名约定-它不是指向club_name
,而是指向Club
对象
推荐阅读
- python - python - 如何在pythons Popen中将args传递给args?
- ios - ios / swift - 我无法附加表格视图单元格
- c++ - 如何从文件中读取值,然后使用它们来初始化 2D 数组 C++
- iphone-x - ios12 和 xcode 10 中的验证码错误
- apache-kafka - KSQL - 在 WINDOW TUMBLING 子句中更改时区
- uicollectionview - IOS ReactorKit 单元选择无法正常工作
- javascript - 如何在 Javascript 中等待多个请求?
- python-3.x - Python 3:如何创建一个包含多个字典的字典,并且其中的键也有多个值?
- swift - 用指向不完整类型的指针作为返回值在 Swift 中实现 ObjC 协议
- java - 新手 Java 问题 - 来自重载构造函数的对象数组没有返回正确的值?