2016-06-10 55 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模型的模型不同。你不應該用這樣的密碼字段創建你自己的模型,它是不安全的。

相關問題