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

問題は、フィルターが複数の結果を返すことです。「最初」または「最後」だけではありません(そのような条件を指定しなかったため)。

2 つ目の問題は、モデルが各コメントに対して複数の応答を許可していないことです。

いくつかの選択肢があります:

  1. モデルを調整して、コメントごとに複数の応答を許可します。これを行うには、 ( を参照)に変更response = models.ForeignKey(Response)してから、ビューを調整します。最初にオブジェクトを作成し、次に各レスポンスを作成します。response = models.ManyToMany(Response)ManyToManyCommentcomment.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)list2 つの Response オブジェクトで返されるため、応答の FK である Comment.response に割り当てることはできません。

ForeignKey は、他のテーブル/モデルの単一のレコードへの参照 (id) のみを格納できます。

于 2012-09-25T04:49:11.937 に答える