1. ホーム
  2. django

[解決済み] django - get() は複数のトピックを返します。

2023-06-11 19:50:36

質問

ある属性と、その属性に関連付けられた MからM を持つ属性と関連づけようとすると、このようなエラーが発生しました。

get() は1つ以上のトピックを返しました -- 2つ返されました!

このエラーが何を意味するのか、また、このエラーを回避する方法を事前に教えていただけませんか?

モデル

class LearningObjective(models.Model):
    learning_objective=models.TextField()

class Topic(models.Model):
    learning_objective_topic=models.ManyToManyField(LearningObjective)
    topic=models.TextField()

の出力は LearningObjective.objects.all()

[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]

の出力は Topic.objects.all()

[<Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>]

ビュー

 def create_themen(request):
     new_topic=Topic(topic=request.POST['topic'])
     new_topic.save()
     return render(request, 'topic.html', {'topic': topic.objects.all()})

 def create_learning_objective(request):
     new_learning_objective=LearningObjective(learning_objective=request.POST['learning_objective'])
     new_learning_objective.save()
     new_learning_objective_topic=Topic.objects.get(topic=request.POST['topic'])
     new_learning_objective_topic.new_learning_objective_topic.add(new_learning_objective)
     return render( request, 'learning_objective.html', {
                    'topic': Topic.objects.all(),
                    'todo': TodoList.objects.all(),
                    'learning_objective': LearningObjective.objects.all()
                  })

どのように解決するのですか?

<ブロッククオート

get() は1つ以上のトピックを返しました -- それは2つを返しました!

上記のエラーは、以下の方法で問い合わせた特定のパラメータに関連する複数のレコードがDBに存在することを示しています。 get() というように

Model.objects.get(field_name=some_param)

このようなエラーを避けるためには、常にスキーマの設計に従ってクエリーを実行する必要があります。 あなたの場合、テーブルを設計する際に 多対多の関係 のテーブルを設計したので、明らかにそのフィールドの複数のレコードが存在することになり、それが上記のエラーが発生する理由です。

そこで get() を使うべきでしょう。 filter() で、複数のレコードを返します。例えば

Model.objects.filter(field_name=some_param)

django でクエリを作成する方法については、こちらをご覧ください。 ここで .