@organica

ForeignKey к определенному полю модели, как?

Господа программисты, подскажите как мне сделать отношение oneToMany через ForeignKey, привязываясь не к конкретной модели, а к ее полю?
class TechType(models.Model):
    type_name = models.CharField(max_length=100, verbose_name='Вид техники', unique=True)

    def __str__(self):
        return self.type_name


class TechUnit(models.Model):
    inner_id = models.CharField(max_length=100, verbose_name='Внутренний номер', unique=True)
    tech_type = models.ForeignKey(TechType, on_delete=models.CASCADE, verbose_name='Вид техники')

    def __str__(self):
        return self.inner_id

Первым делом я создаю 4 экземпляра класса TechType.
Далее я создаю экземпляры класса TechUnit: ввожу его Inner_id и выбираю из выпадающего списка к какому типу техники он относится в TechType. Выбор происходит нормально, в выпадающем списке появляются ровно те категории техники, которые я завел на предыдущем шаге.
Однако далее я начал ловить ошибки, связанные с приведением текста к строке и долго не мог понять в чем причина, пока случайно не создал новый TechType под названием 4 и ошибка пропала. Мой шаблон загрузился и выдал мне нужную информацию. Залез в БД и нашел занятную вещь( см. скриншот). Мой TechUnit в БД привязан к id TechType, а не к полю TechType type_name. К примеру, TechUnit с inner_id 114 привязан к TechType Pallet_truck, а в БД он привязан к tech_type_id = 4. Как мне привязаться к полю type_name у класса TechType???
5dc705c73b3a7158919268.jpeg
  • Вопрос задан
  • 264 просмотра
Пригласить эксперта
Ответы на вопрос 1
cellmon
@cellmon
Botviber
Или если обьектов класса не много десяток - два! Вообще ликвидируйте модель TechType
а в модели TechUnit, поле tech_type заполняйте через choises

class TechUnit(models.Model):
    type_name1 = 'номер1'
    type_name2 = 'номер2'
    type_name3 = 'номер3'
    Category = [
        ( type_name1, 'номер1'),
        ( type_name2, 'номер2'),
        ( type_name3, 'номер3'),
    ]
    inner_id = models.CharField(max_length=100, verbose_name='Внутренний номер', unique=True)
    tech_type = models.CharField(max_length=100, verbose_name='Вид техники', choices=Category, 
                default=Main) 
   def __str__(self):
        return self.inner_id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы