Не удается назначить «‘somedata'»: «otherdatal» должен быть экземпляром»».`

#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()