将 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
模型不同。您不应该使用这样的密码字段创建自己的模型,这是不安全的。
保存具有外键的对象时,出现常见错误: '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
模型不同。您不应该使用这样的密码字段创建自己的模型,这是不安全的。