#python #django #django-models #instance
Вопрос:
Можно ли вставить значение сеанса во внешний ключ?
У меня есть 2 модели
class candidate(models.Model): fname=models.CharField("First name ",max_length=20,default="") lname=models.CharField("Last name ",max_length=20,default="") email=models.EmailField("Email ",max_length=254,primary_key=True) password=models.CharField("Password ",max_length=100,default="") def __str__(self): return self.email #self.fname " " self.lname class canDetails(models.Model): candEmail=models.ForeignKey(candidate,on_delete=models.CASCADE) location=models.CharField("location ",max_length=30) role=models.CharField("role ",max_length=20) cv=models.FileField(upload_to="media/canDetails/") def __str__(self): return self.candEmail
Я беру электронное письмо из вышеприведенной модели в качестве сеанса и пытаюсь поместить это значение сеанса в поле внешнего ключа другой модели, но здесь я получаю ошибку, такую как:
Не удается назначить «‘cb@gmail.com'»: «canDetails.candEmail» должен быть экземпляром «кандидат».
Я пытаюсь получить все детали от модели-кандидата и модели candDetails сразу,вот почему я использую здесь pf и fk, так правильно ли я следую…? как я могу с этим справиться ? любые предложения, пожалуйста.?
Ответ №1:
Модель canDetails
должна знать, к какой candidate
она принадлежит, поэтому Foreingkey
поле должно быть candidate
экземпляром (в базе данных хранится значение PK). Я настоятельно рекомендую, как и в документах Django, назвать поле candidate
и прописные буквы в названиях моделей для большей ясности.
class Candidate(models.Model): ... class CanDetails(models.Model): candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE) ...
Если у вас есть только электронное письмо, вы можете использовать его, чтобы найти, Candidate
кому оно принадлежит, извлечь этот экземпляр и назначить его CanDetails
. Например:
try: the_candidate = Candidate.objects.get(email='cb@gmail.com') except (Candidate.DoesNotExist, Candidate.MultipleObjectsReturned): # raise error or exit return det = CanDetails() det.candidate = the_candidate ... det.save()