保存具有ForeignKey的对象时,出现常见错误: '无法指定(myObject)“:”(我的ForeignKey字段)“必须是实例。保存ForeignKey作为实例,但它仍然抱怨
这个问题是清楚的回答:
Django - Foreign Key must be an instance
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 })
实际的错误是: “不能分配 “用户:[email protected]”: “Answer.answered_by” 必须是一个“用户”实例“。
奇怪的是,我的回答模型有两个ForeignKeys,但这样做
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)
,我得到的错误: “列answer.id不存在”
在这种情况下, ,Postgres数据库中有一个名为answers_by_id的实际列,所以我不明白它为什么寻找一个隐藏的,显然是自动生成的“answer.id”列。
但无论如何,我宁愿得到将实例传递给ForeignKey字段的默认方法。
有什么明显的我可以忽略?如果只是一个错字,我会感到尴尬。
啊,是的。我安装了使用内置用户的django-allauth应用程序,但没有删除我自己的用户模型。我把你的评论投了票,如果这是我接受的答案。 – Ron