Как использовать атрибут внешнего ключа в 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.

Вернуться на верх