Как я могу получить доступ к полям модели из внешнего ключа, который является ссылкой на другую модель? - PullRequest
0 голосов
/ 05 января 2019

У меня есть модель, которая содержит пользователя, каждый пользователь связан с клубом, клуб может содержать много команд, полей и т. Д. Я хочу знать, как я должен проектировать свои модели, чтобы я мог отображать / редактировать информацию о командах / Pitch на основе пользователя, вошедшего в систему и клуб, связанный с этим пользователем. Моя модель ClubInfo содержит внешний ключ, связанный с пользователем, в то время как другие мои модели (Team / Pitch) имеют внешние ключи, связанные с 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

1 Ответ

0 голосов
/ 05 января 2019
  1. клуб может содержать много команд, полей и т. Д.

Тогда вы, вероятно, не хотите использовать unique=True в своих внешних ключах, так как поведение очень похоже на OneToOneField. Это будет означать, что в каждом клубе может быть только один игрок, один шаг и т. д.

Пожалуйста, обратитесь к: В чем разница между django OneToOneField и ForeignKey?

  1. Вам не нужно писать явно to_field='id', это значение по умолчанию для to_field аргумента

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.to_field

  1. , чтобы я мог отображать / редактировать информацию о командах / передачах, основываясь на зарегистрированном пользователе

Вам необходимо определить обратную связь: 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
  1. В вашем текущем дизайне (после удаления unique=True) команда может состоять только одного игрока, и игроки могут быть во многих командах. Это ожидается? Скорее всего, вы хотели бы иметь

1) Команда со многими игроками - тогда вам нужно будет добавить внешний ключ к Team в Player модели

2) Команда со многими игроками, но также игроки могут быть во многих командах - тогда вы хотели бы иметь отношения многих ко многим: https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/

  1. club_name, поскольку внешний ключ является плохим соглашением об именах - он указывает не на club_name, а на Club объект
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...