0

我得到这个错误:Cannot assign "[<Response: Response object>, <Response: Response object>]": "Comment.response" must be a "Response" instance如何通过匹配申请人和面试 ID 为实例分配响应?另外,我只想要 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 的新手 :( 非常感谢任何帮助!

4

2 回答 2

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)

您的模型具有您不需要的冗余字段。由于Comment与 有关系Response,因此您无需ResponseComment模型中复制字段。您可以关注关系并获取相关字段:

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)。

于 2012-09-25T05:01:25.300 回答
1

由于您的查询Response.objects.filter(interview = interview, applicant = applicant)返回list其中包含两个响应对象,因此无法将其分配给 Comment.response ,这是对响应的 FK。

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

于 2012-09-25T04:49:11.937 回答