diff --git a/jedi/plugins/django.py b/jedi/plugins/django.py index c2b95026..5100eef2 100644 --- a/jedi/plugins/django.py +++ b/jedi/plugins/django.py @@ -58,31 +58,32 @@ def _infer_scalar_field(inference_state, field_name, field_tree_instance): else: module = inference_state.import_module((module_name,)) - attribute, = module.py__getattribute__(attribute_name) - return DjangoModelField(attribute, field_name) + for attribute in module.py__getattribute__(attribute_name): + return DjangoModelField(attribute, field_name) def _infer_field(cls, field_name): inference_state = cls.inference_state - field_tree_instance, = field_name.infer() - scalar_field = _infer_scalar_field(inference_state, field_name, field_tree_instance) - if scalar_field: - return scalar_field + for field_tree_instance in field_name.infer(): + scalar_field = _infer_scalar_field(inference_state, field_name, field_tree_instance) + if scalar_field: + return scalar_field - if field_tree_instance.py__name__() == 'ForeignKey': - if isinstance(field_tree_instance, TreeInstance): - # TODO private access.. - argument_iterator = field_tree_instance._arguments.unpack() - key, lazy_values = next(argument_iterator, (None, None)) - if key is None and lazy_values is not None: - for value in lazy_values.infer(): - if value.py__name__() == 'str': - foreign_key_class_name = value.get_safe_value() - for v in cls.get_root_context().py__getattribute__(foreign_key_class_name): - if v.is_class(): - return DjangoModelField(v, field_name) - elif value.is_class(): - return DjangoModelField(value, field_name) + if field_tree_instance.py__name__() == 'ForeignKey': + if isinstance(field_tree_instance, TreeInstance): + # TODO private access.. + argument_iterator = field_tree_instance._arguments.unpack() + key, lazy_values = next(argument_iterator, (None, None)) + if key is None and lazy_values is not None: + for value in lazy_values.infer(): + if value.py__name__() == 'str': + foreign_key_class_name = value.get_safe_value() + module = cls.get_root_context() + for v in module.py__getattribute__(foreign_key_class_name): + if v.is_class(): + return DjangoModelField(v, field_name) + elif value.is_class(): + return DjangoModelField(value, field_name) debug.dbg('django plugin: fail to infer `%s` from class `%s`', field_name.string_name, cls.py__name__()) diff --git a/test/completion/django.py b/test/completion/django.py index b89e67d2..6bdc2eea 100644 --- a/test/completion/django.py +++ b/test/completion/django.py @@ -17,6 +17,7 @@ class BusinessModel(models.Model): category_fk2 = models.ForeignKey('Category') category_fk3 = models.ForeignKey(1) category_fk4 = models.ForeignKey('models') + category_fk5 = models.ForeignKey() integer_field = models.IntegerField() big_integer_field = models.BigIntegerField() positive_integer_field = models.PositiveIntegerField() @@ -34,6 +35,8 @@ class BusinessModel(models.Model): date_time_field = models.DateTimeField() tags_m2m = models.ManyToManyField(Tag) + unidentifiable = NOT_FOUND + model_instance = BusinessModel() #? int() @@ -79,6 +82,13 @@ model_instance.category_fk2.category_name model_instance.category_fk3 #? models.ForeignKey() model_instance.category_fk4 +#? models.ForeignKey() +model_instance.category_fk5 #? models.ManyToManyField() model_instance.tags_m2m + +#? +model_instance.unidentifiable +#! ['unidentifiable = NOT_FOUND'] +model_instance.unidentifiable