From ba4e3393d35c0e7057bd9eeefc65542f5b8ad374 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 22 Apr 2020 00:27:06 +0200 Subject: [PATCH] Fix ForeignKey issues with invalid values --- jedi/plugins/django.py | 8 +++++--- test/completion/django.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/jedi/plugins/django.py b/jedi/plugins/django.py index b299933f..1ab59464 100644 --- a/jedi/plugins/django.py +++ b/jedi/plugins/django.py @@ -48,10 +48,11 @@ mapping = { def _infer_scalar_field(cls, field, field_tree_instance): - if field_tree_instance.name.string_name not in mapping: + try: + module_name, attribute_name = mapping[field_tree_instance.name.string_name] + except KeyError: return None - module_name, attribute_name = mapping[field_tree_instance.name.string_name] if module_name is None: module = cls.inference_state.builtins_module else: @@ -69,6 +70,7 @@ def _infer_field(cls, field): if field_tree_instance.name.string_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: @@ -77,7 +79,7 @@ def _infer_field(cls, field): foreign_key_class_name = value.get_safe_value() for v in cls.parent_context.py__getattribute__(foreign_key_class_name): return DjangoModelField(v, field) - else: + elif value.is_class(): return DjangoModelField(value, field) debug.dbg('django plugin: fail to infer `%s` from class `%s`', diff --git a/test/completion/django.py b/test/completion/django.py index 23ad6f43..8d56915c 100644 --- a/test/completion/django.py +++ b/test/completion/django.py @@ -14,6 +14,8 @@ class Category(models.Model): class BusinessModel(models.Model): category_fk = models.ForeignKey(Category) + category_fk2 = models.ForeignKey('Category') + category_fk3 = models.ForeignKey(1) integer_field = models.IntegerField() big_integer_field = models.BigIntegerField() positive_integer_field = models.PositiveIntegerField() @@ -63,9 +65,17 @@ model_instance.duration_field model_instance.date_field #? datetime.datetime() model_instance.date_time_field + #? Category() model_instance.category_fk #? str() model_instance.category_fk.category_name +#? Category() +model_instance.category_fk2 +#? str() +model_instance.category_fk2.category_name +#? models.ForeignKey() +model_instance.category_fk3 + #? models.ManyToManyField() model_instance.tags_m2m