Как использовать атрибут внешнего ключа в Django
Как и в этом примере, я хочу использовать категорию для получения пути к каталогу.
class Team_Type(models.Model):
category = models.CharField(max_length=50)
def __str__(self):
return self.category
class Team_member(models.Model):
category = models.ForeignKey(Team_Type, on_delete=models.CASCADE)
name = models.CharField(max_length=40)
designation = models.CharField(max_length=50)
link = models.URLField(max_length=100)
photo = models.ImageField(upload_to='hwc')
def __str__(self):
return self.designation
Нечто в форме
photo = models.ImageField(upload_to='hwc/'+ category)
Я пробовал использовать os.path следующими способами, но безуспешно
photo = models.ImageField(upload_to=os.path.join('hwc', category.category))
photo = models.ImageField(upload_to=os.path.join('hwc', category.__str__()))
Это не работает, поскольку категория является foreignkey, а у меня нет такого атрибута. Есть альтернативное решение?
ForeignKey - это ключ базы данных, который используется для соединения двух таблиц вместе. Здесь мы можем сказать, что внешний ключ category
соединяет модели Team_Type
и Team_member
вместе, ссылаясь на первичный ключ модели Team_Type
.
Если вы явно не определяете первичный ключ в вашей таблице или классе модели в Django, то Django автоматически создает переменную поля Integer по умолчанию и использует ее в качестве первичного ключа. Обратите внимание, что внешний ключ в Team_member
ссылается на первичный ключ в Team_Type
.
В вашем случае первичный ключ класса модели Team_Type
- это поле Integer, которое создает Django.
Вы должны явно указать, какая переменная в модели Team_Type
должна быть первичным ключом и ссылаться на внешний ключ Team_member
.
Вы можете сделать это, просто изменив свой код следующим образом.
class Team_Type(models.Model):
category = models.CharField(max_length=50, primary_key=True)
def __str__(self):
return self.category
Теперь внешний ключ в Team_member
будет иметь ссылку на первичный ключ модели Team_Type
, то есть поле category
.