2016-06-10 53 views
0

保存具有ForeignKey的对象时,出现常见错误: '无法指定(myObject)“:”(我的ForeignKey字段)“必须是实例。保存ForeignKey作为实例,但它仍然抱怨

这个问题是清楚的回答:

django foreign key save

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字段的默认方法。

有什么明显的我可以忽略?如果只是一个错字,我会感到尴尬。

+0

啊,是的。我安装了使用内置用户的django-allauth应用程序,但没有删除我自己的用户模型。我把你的评论投了票,如果这是我接受的答案。 – Ron

回答

0

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

相关问题