Следующий код содержит ошибку в указанной строке (ближе к концу с "<===") или, возможно, в строке после этого: </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. Так что проверка для этого нуждается в добавлении. Но это не относится к этой проблеме.