Django ошибка "аргумент типа 'ForeignKey' не повторяется" - PullRequest
0 голосов
/ 09 марта 2020

Следующий код содержит ошибку в указанной строке (ближе к концу с "<===") или, возможно, в строке после этого: </p>

class InspectModelUpdated(InspectModel):
    """
    Updated for compatibility with Django 1.10 +
    Replaced the get_all_field_names and get_field_by_name methods,
    which have been removed from the Model._meta API.
    https://docs.djangoproject.com/en/2.0/ref/models/meta/#migrating-from-the-old-api
    """
    def update_fields(self):
        """Set the list of django.db.models fields

        Three different types of fields:
        * standard model fields: Char, Integer...
        * relation fields: OneToOne (back and forth), ForeignKey,
          and GenericForeignKey
        * many fields: ManyToMany (back and forth)

        """
        self.fields = set()
        self.relation_fields = set()
        self.many_fields = set()
        opts = getattr(self.model, '_meta', None)
        if opts:
            for field in opts.get_fields():
                model = field.model
                direct = not field.auto_created or field.concrete
                m2m = field.many_to_many
                if not direct:  # relation or many field from another model
                    name = field.get_accessor_name()

                    field = field.field                                           <==============
                    jr_rel = field.rel if 'rel' in field else field.remote_field
                    if jr_rel.multiple:  # m2m or fk to this model
                        self._add_item(name, self.many_fields)
                    else:  # one to one
                        self._add_item(name, self.relation_fields)

Я добавил отладочный дамп непосредственно перед этим строка, чтобы вывести атрибуты поля, и для одного примера ошибки, которую он вывел:

in update_fields() - vars(field) =
{
    'field'              : <django.db.models.fields.related.ForeignKey: survey>,
    'model'              : <class 'app.survey.models.survey.Survey'>,
    'related_name'       : 'survey_question_related',
    'related_query_name' : None,
    'limit_choices_to'   : {},
    'parent_link'        : False,
    'on_delete'          : <function CASCADE at 0x7efd063bb488>,
    'symmetrical'        : False,
    'multiple'           : True,
    'field_name'         : 'id',
    'related_model'      : <class 'app.survey.models.question.Question'>,
    'hidden'             : False,
    'name'               : 'survey_question_related',
    'many_to_many'       : False
}

Таким образом, Django (или, возможно, Python?), кажется, думает выражение "field.field" пытается перебрать ForeignKey. Но если какое-то умное дурачество не происходит за кулисами, это выражение является просто ссылкой на объект, не так ли?

Возможно, следующая строка вызывает проблему, так как я исправил эту строку для Django 3.0 .4 потому что атрибут rel больше не определен:

jr_rel = field.rel if 'rel' in field else field.remote_field

Но если это так, то это одинаково сбивает с толку, потому что, опять же, нет ничего похожего на то, что можно было бы интерпретировать как итерацию.

Любые идеи? Я надеюсь, что приведенная выше информация довольно автономна

С уважением

Джон Рамсден

PS Я заметил, что нет проверки, что remote_field является атрибутом field.field. Так что проверка для этого нуждается в добавлении. Но это не относится к этой проблеме.

1 Ответ

1 голос
/ 09 марта 2020

Проблема в этой строке:

jr_rel = field.rel if 'rel' in field else field.remote_field

В частности, if 'rel' in field

Это выражение, которое пытается перебрать field. Возможно, вы хотели посмотреть на значение поля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...