

**前提・実現したいこと**  
私はDjangoのチュートリアルに取り組んでいます。  
対話型シェルを呼び出し、データベースAPIにアクセスするためのコマンドを使用するために以下のサイトを参照していましたが、エラーが発生していまいました。解決策をお教え下さい。

<https://docs.djangoproject.com/ja/4.0/intro/tutorial02/>

**発生している問題・エラーメッセージ**

[code]

    >>> from polls.models import Choice, Question
    >>> Question.objects.all()
    <QuerySet [<Question: Question object (1)>]>
    >>> Question.objects.filter(id=1)
    <QuerySet [<Question: Question object (1)>]>
    >>> Question.objects.filter(question_text__startswith='What')
    Traceback (most recent call last):
      "<console>", line 1, in <module>
      "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\query.py", line 1071, in filter
        return self._filter_or_exclude(False, args, kwargs)
      "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\query.py", line 1089, in _filter_or_exclude
        clone._filter_or_exclude_inplace(negate, args, kwargs)
     "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\query.py", line 1096, in _filter_or_exclude_inplace
        self._query.add_q(Q(*args, **kwargs))
     "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\query.py", line 1502, in add_q
         clause, _ = self._add_q(q_object, self.used_aliases)
     "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\query.py", line 1532, in _add_q
         child_clause, needed_inner = self.build_filter(
      "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\query.py", line 1377, in build_filter
          lookups, parts, reffed_expression = self.solve_lookup_type(arg)
      "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\query.py", line 1187, in solve_lookup_type
           _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
       "\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\sql\query.py", line 1677, in names_to_path
           raise FieldError(
        django.core.exceptions.FieldError: Cannot resolve keyword 'question_text' into field. Choices are: id
    
[/code]

**該当のソースコード**  
エラーが起きている所には☆を付けました。

manaper.py line 85

[code]

     def check(self, **kwargs):
        return []
    
    @classmethod
    def _get_queryset_methods(cls, queryset_class):
        def create_method(name, method):
            def manager_method(self, *args, **kwargs):
             ☆ return getattr(self.get_queryset(), name)(*args, **kwargs)
    
        manager_method.__name__ = method.__name__
        manager_method.__doc__ = method.__doc__
        return manager_method
    
    new_methods = {}
    for name, method in inspect.getmembers(
        queryset_class, predicate=inspect.isfunction
    ):
        # Only copy missing methods.
        if hasattr(cls, name):
            continue
        # Only copy public methods or methods with the attribute
        # queryset_only=False.
        queryset_only = getattr(method, "queryset_only", None)
        if queryset_only or (queryset_only is None and name.startswith("_")):
            continue
        # Copy the method onto the manager.
        new_methods[name] = create_method(name, method)
    return new_methods
    
[/code]

query.py line 1071,1089,1096

[code]

    def all(self):
    """
    Return a new QuerySet that is a copy of the current one. This allows a
    QuerySet to proxy for a model manager in some cases.
    """
    return self._chain()
    
    def filter(self, *args, **kwargs):
        """
        Return a new QuerySet instance with the args ANDed to the existing
        set.
        """
        self._not_support_combined_queries("filter")
     ☆ return self._filter_or_exclude(False, args, kwargs)
    
    def exclude(self, *args, **kwargs):
        """
        Return a new QuerySet instance with NOT (args) ANDed to the existing
        set.
        """
        self._not_support_combined_queries("exclude")
        return self._filter_or_exclude(True, args, kwargs)
    
    def _filter_or_exclude(self, negate, args, kwargs):
        if (args or kwargs) and self.query.is_sliced:
            raise TypeError("Cannot filter a query once a slice has been taken.")
        clone = self._chain()
        if self._defer_next_filter:
            self._defer_next_filter = False
            clone._deferred_filter = negate, args, kwargs
        else:
         ☆ clone._filter_or_exclude_inplace(negate, args, kwargs)
        return clone
    
    def _filter_or_exclude_inplace(self, negate, args, kwargs):
        if negate:
            self._query.add_q(~Q(*args, **kwargs))
        else:
         ☆ self._query.add_q(Q(*args, **kwargs))
        
    
[/code]

query.py line 1577

[code]

        def using(self, alias):
        """Select which database this QuerySet should execute against."""
        clone = self._chain()
     ☆ clone._db = alias
        return clone
    
[/code]

query.py line 1187

[code]

    def select_related(self, *fields):
    """
    Return a new QuerySet instance that will select related objects.
    
    If fields are specified, they must be ForeignKey fields and only those
    related objects are included in the selection.
    
    If select_related(None) is called, clear the list.
    """
    self._not_support_combined_queries("select_related")
    if self._fields is not None:
        raise TypeError(
            "Cannot call select_related() after .values() or .values_list()"
        )
    
    obj = self._chain()
    if fields == (None,):
     ☆ obj.query.select_related = False
    elif fields:
        obj.query.add_select_related(fields)
    else:
        obj.query.select_related = True
    return obj
    
[/code]

query.py line 1677

[code]

        def _clone(self):
        """Same as QuerySet._clone()"""
        c = self.__class__(
            self.raw_query,
            model=self.model,
            query=self.query,
            params=self.params,
            translations=self.translations,
            using=self._db,
            hints=self._hints,
        )
        c._prefetch_related_lookups = self._prefetch_related_lookups[:]
        return c
    ☆
        def _fetch_all(self):
            if self._result_cache is None:
                self._result_cache = list(self.iterator())
            if self._prefetch_related_lookups and not self._prefetch_done:
                self._prefetch_related_objects()
    
[/code]

**その他**

[code]

    >>> Question.objects.all()
    <QuerySet [<Question: What's up?>]>
    >>> Question.objects.filter(id=1)
    <QuerySet [<Question: What's up?>]>
    
[/code]


CC BY-SA 4.0
2022-05-09T13:02:29.340
88734
2022-05-10T12:15:57.777
2022-05-09T16:22:32.313
3060
52539
question
python django
Djangoの対話シェルAPIでエラーが起きてしまう


**発生している問題・エラーメッセージ** に提示されているのは、参照先ページの [API
で遊んでみる](https://docs.djangoproject.com/ja/4.0/intro/tutorial02/#playing-with-
the-api) の中で2つ目の対話シェルでの作業と考えられます。  
以下が記述されている所の後の部分ですね。

> 変更を保存して、もう一度 **python manage.py shell** を実行して新しい Python 対話シェルを始めましょう:

**発生している問題・エラーメッセージ** の先頭の結果表示の部分が、本来なら質問記事最後の **その他** で示された内容になるはずです。

* * *

問題と原因の可能性としては以下のどれか、あるいはそれらの組み合わせが考えられます。

  * [API で遊んでみる](https://docs.djangoproject.com/ja/4.0/intro/tutorial02/#playing-with-the-api) の最初の対話シェルでの作業がきちんと最後まで行われていなかった。  
文字列とか日時の設定や、その後の`q.save()`を行っていない？など。

  * 同じ個所の最初の対話シェルでの作業後の`polls/models.py`ファイルの編集(`__str__()`メソッドや`import`等の追加)を行っていない。

  * 同じ個所の最初の対話シェルでの作業後の`polls/models.py`ファイルの編集を間違えた。  
例えばページ最初の[モデルの作成](https://docs.djangoproject.com/ja/4.0/intro/tutorial02/#creating-
models-1)で作成した`polls/models.py`ファイルに初期から入っていた変数の設定行等を`#
...`で置き換えて削除してしまったとか、あるいは単純に追記時のtypoとか。

* * *

**該当のソースコード** で提示されている各ソースコードは、Django自身のソースコードなので質問の説明としてはあまり意味がありません。

@quickquip
さんがコメントされているように、重要なのはTutorial記事で作成・編集している`polls/models.py`ファイルの内容なので、それを提示・確認してください。


CC BY-SA 4.0
2022-05-09T17:41:19.673
88738
2022-05-09T17:41:19.673
26370
88734
answer