ホームページ >バックエンド開発 >Python チュートリアル >解決策:djangoExceptions.FieldError(\'リレーションには複数のターゲット フィールドがありますが、\'\'要求されたターゲット フィールドは 1 つだけです\')
FieldError("relation には複数のターゲット フィールドがありますが、要求されたターゲット フィールドは 1 つだけです。" ) このエラーは通常、実際に複数のターゲット フィールドがある関連オブジェクトのフィールドにアクセスしようとすると発生します。
たとえば、モデル「Author」とモデル「Book」があり、それらの間に多対多の関係があるとします。このエラーは、`Author` オブジェクトの `book` フィールドにアクセスしようとしたが、関連付けられたオブジェクトが実際には複数の `Book` オブジェクトに関連付けられている場合に発生します。
この問題を解決するには、複数のターゲット フィールドにアクセスする方法を使用するようにコードを変更する必要があります。たとえば、`Author.book_set.all()` を使用すると、`Author` オブジェクトのすべての `Book` オブジェクトを取得できます。
上記の情報が問題の解決に役立つことを願っています。
FieldError("リレーションには複数のターゲット フィールドがありますが、要求されたのは 1 つのターゲット フィールドのみです") エラーを解決するには、次の方法を使用するようにコードを変更する必要があります。複数のターゲットフィールドにアクセスします。具体的には、次のいずれかの方法を使用できます。
- `relative_name` 属性を使用して、関連オブジェクトにアクセスするためのカスタム名を指定します。たとえば、多対多の関係を定義するときに「関連名='書籍'」を指定し、「Author.books.all()」を使用して「著者」オブジェクトのすべての「書籍」オブジェクトを取得できます。
#-Django の `relative_objects` クエリセットを使用して、関連オブジェクトにアクセスします。たとえば、`Author.relative_objects.all()` を使用すると、`Author` オブジェクトのすべての関連オブジェクトを取得できます。
- DjanGo の `through` パラメーターを使用して中間モデルを作成し、この中間モデルを使用して関連オブジェクトにアクセスします。たとえば、中間モデル `BookAuthor` を定義したと仮定すると、`Author.bookauthor_set.all()` を使用して `Author` オブジェクトのすべての `BookAuthor` オブジェクトを取得し、各 `BookAuthor` オブジェクトにアクセスできます。 book` フィールドを使用して、対応する `Book` オブジェクトを取得します。
何が問題だったのかを調べるために、コードをデバッグする必要がある場合があります。以下に役立つ手順をいくつか示します。 - 関連するフィールドが正しいことを確認してください。たとえば、多対多の関係を定義する場合は、`ForeignKey` や `OneToOneField` ではなく、`ManyToManyField` フィールドを使用して関係を表す必要があります。#- 関連するオブジェクトが正しく設定されていることを確認してください。たとえば、多対多の関係がある場合は、各モデル間に `ManyToManyField` フィールドを定義し、もう一方を `relative_name` パラメーターとして指定する必要があります。
#- 中間モデルを使用して関連を表す場合は、中間モデルを正しく定義し、正しい `through` パラメーターを指定していることを確認してください。#-- カスタム名を使用して関連オブジェクトにアクセスする場合は、「関連付けられた名前」パラメータが正しく指定されていることを確認してください。
- Django のデバッグ
toolsを使用して、クエリセットが正しいかどうかを確認してください。たとえば、`.query` プロパティを使用して生成された
sqlステートメントを確認したり、`print(list(qs))` を使用してクエリ セットに含まれるオブジェクトを確認したりできます。 上記の情報がお役に立てば幸いです。 使用例
ここでは、`Book` モデルと `Author` モデルがあり、複数の書籍を許可する多対多の関係を定義したいと仮定した例を示します。複数の著者がおり、各著者は複数の本を書くことができます:
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author, related_name='books')
# 获取书的所有作者 book.authors.all() # 获取作者写的所有书 author.books.all()
関連フィールドを定義するときに、間違ったフィールド タイプを使用する (たとえば、`ManyToManyField` の代わりに `ForeignKey` を使用する) などの問題が発生した場合、「リレーションには複数のターゲット フィールドがあります」のようなエラー メッセージが表示されることがあります。 。この場合、コードをチェックして、正しいフィールド タイプを使用していることを確認する必要があります。
間違った名前を使用するなど、関連付けられたオブジェクトへのアクセスに問題がある場合 (例: 著者のリストを取得するために `book.authors.all()` の代わりに `book.authors` を使用しようとする)、 「このメソッドはサブクラスで実装する必要があります」のようなエラー メッセージが表示される場合があります。この場合、コードをチェックして、関連付けにアクセスするための正しい方法を使用していることを確認する必要があります。申し訳ありませんが、何を質問しようとしているのかわかりません。引き続きご質問いただければ、お答えさせていただきます。
以上が解決策:djangoExceptions.FieldError(\'リレーションには複数のターゲット フィールドがありますが、\'\'要求されたターゲット フィールドは 1 つだけです\')の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。