将 ForeignKey 保存为实例,但它仍然会抱怨

Saving ForeignKey as instance but it complains anyway

保存具有外键的对象时,出现常见错误: 'Cannot assign "(myObject)": "(my ForeignKey field)" must be an instance'.

这个问题回答的很清楚:

django foreign key save

Django ForeignKey Instance vs Raw ID

但这些解决方案对我不起作用。

models.py

class User(models.Model):
  email = models.EmailField(max_length=100, unique=True)
  password = models.CharField(validators=[MinLengthValidator(8)],max_length=60)
  is_teacher = models.BooleanField(default=0)


class Question(models.Model):
  question_text = models.CharField(max_length=5000)
  pub_date = models.DateTimeField('date asked')
  answered = models.BooleanField(default=False)
  asker = models.IntegerField(default=0)
  def __str__(self):
    return self.question_text
  def was_published_recently(self):
    now = timezone.now()
    return now - datetime.timedelta(days=1) <= self.pub_date <= now;
  def asked_by(self):
    return self.asker

class Answer(models.Model):
  to_question = ForeignKey(Question, null=False)
  pub_date = models.DateTimeField('date answered')
  answer_text = models.CharField(max_length=10000)
  answered_by = ForeignKey(User, null=False)
  def __str__(self):
    return self.answer_text

views.py

@staff_member_required()
def answerQuestion(request):
  if request.method == 'POST':
    form = QuestionAnswerForm(request.POST,label_suffix='',error_class=DivErrorList)
    if form.is_valid():
      answer_text = request.POST['answer_text']
      question_id = request.POST['question_id']
      now = timezone.now()
      try:
        to_question = Question.objects.get(pk=question_id)
        answered_by= User.objects.get(pk=request.user.id)
        Answer.objects.create(answer_text=answer_text, to_question=to_question, pub_date=now, answered_by=answered_by)
        return render(request, 'askWisdom/answerQuestion.html', { 'result':'Thanks for Your Answer' })
      except Question.DoesNotExist:
        return HttpResponse("Question doesn't exist.")
      except User.DoesNotExist:
        return HttpResponse("Answering User doesn't exist.")

    else:
      return render(request, 'askWisdom/answerQuestion.html', {'form': form, 'error_message': form.errors })

实际错误是: 'Cannot assign "User: sampleUser@gmail.com": "Answer.answered_by" must be a "User" instance'.

奇怪的是,我的 Answer 模型有两个外键,但是当

Answer.objects.create(answer_text=answer_text, to_question=to_question, pub_date=now, answered_by=answered_by)

错误在第二个 ForeignKey (answered_by=answered_by) 上标记,但在第一个 (to_question=to_question) 上没有标记,假设它们是按顺序处理的.

好的,所以将其更改为强制在数据库级别保存数字 ID:

answered_by_id= User.objects.get(pk=request.user.id).id
Answer.objects.create(answer_text=answer_text, to_question=to_question, pub_date=now, answered_by_id=answered_by_id)

我得到了错误: 'column answer.id does not exist'

在这种情况下,Postgres 数据库中有一个名为 answered_by_id 的实际列,所以我不明白为什么它要寻找一个隐藏的、显然是自动生成的 'answer.id' 列。

但无论如何,我宁愿使用将实例传递给 ForeignKey 字段的默认方法。

我是否忽略了一些明显的东西?如果只是打错了我会很尴尬的。

除非您设置了自定义用户模型,否则 request.user 将是一个 django.contrib.auth.models.User 实例,与您的 User 模型不同。您不应该使用这样的密码字段创建自己的模型,这是不安全的。