2012-09-25 47 views
0

我收到此错误:Cannot assign "[<Response: Response object>, <Response: Response object>]": "Comment.response" must be a "Response" instance如何通过匹配申请人和面试ID来为实例分配回复? 另外,我只想出从objects.filter()的所有可能结果的第一反应Django objects.filter问题

def post_comment(request, interview_id, applicant_id): 
    if request.POST: 
    text = str(request.POST['add_comment']) 
    interview = Interview.objects.get(id = interview_id) 
    applicant = Applicant.objects.get(id = applicant_id) 
    response = Response.objects.filter(interview = interview, applicant = applicant) 
    date = datetime.datetime.now() 
comment = Comment(
    user = request.user, 
    applicant = applicant, 
    interview = interview, 
    response = response, 
    comment = text, 
    created_at = date, 
) 

我的型号如下:

class Response(models.Model): 
    video_guid = models.CharField(max_length=32) 
    interview = models.ForeignKey(Interview) 
    applicant = models.ForeignKey(Applicant) 
    question = models.ForeignKey(Question) 


class Comment(models.Model): 
    user = models.ForeignKey(User) 
    applicant = models.ForeignKey(Applicant) 
    interview = models.ForeignKey(Interview) 
    response = models.ForeignKey(Response) 
    comment = models.TextField(default='') 
    created_at = models.DateTimeField(default=datetime.datetime.now()) 

我是新来的Django :(任何帮助高度赞赏!

回答

1

作为查询Response.objects.filter(interview = interview, applicant = applicant)是带有两个响应对象返回list,是不是可以分配给Comment.response这是FK来响应。

ForeignKey只能将引用(id)存储到其他表/模型的单个记录中。

+0

我怎么能只选择第一个结果列表中返回?我试过Response.objects.filter(采访=采访时,申请人=申请人)[0]没有工作.. – user1678031

2

你的问题是你的过滤器返回多个结果;不只是“第一”或“最后”(因为你没有指定这样的条件)。

第二个问题是您的模型不允许每个评论有多个响应。

您有几种选择:

  1. 调整模型,以便为每个评论多个响应。为此,请将response = models.ForeignKey(Response)更改为response = models.ManyToMany(Response)(请参阅ManyToMany),然后调整视图。首先创建一个Comment对象,然后每个响应comment.response.add()

  2. 为每个响应条目创建多个comment对象。这可能并不理想;但它可以工作而无需迁移数据库模式。

这里是它会怎样看:

for i in response: 
    Comment.objects.create(
      user = request.user, 
      applicant = applicant, 
      interview = interview, 
      response = i, 
      comment = text, 
      created_at = date) 

你的车型有,你并不需要多余的字段。由于CommentResponse有关系,因此您无需复制Comment模型中的Response中的字段。您可以follow relationships并获得相关领域:

c = Comment.objects.get(pk=1) 
c.response.interview # interview object 

# Get all the comments for where the interview objects primary key is 1 
c = Comment.objects.filter(response__interview__pk=1) 

r = Response.objects.get(pk=1) 
r.comment_set.all() # all comments for this response 

之前,你坐下来写你的模型,写下你需要做的对数据库是什么样的查询。这将帮助您决定需要哪些字段(以及哪些关系)。例如,现在无法获得特定访问的“第一”或“最后”回复(因为Response中没有日期字段)。

+2

我想补充一点,即使单个响应被过滤器返回,它仍然会出错,因为过滤器返回结果的“列表”,即使只有一个响应。 –