diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6e6d7df2..dd91b971 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -10,3 +10,4 @@ * [bittner](https://github.com/bittner) * [federicobond](https://github.com/federicobond) * [matusvalo](https://github.com/matusvalo) +* [fadedDexofan](https://github.com/fadeddexofan) \ No newline at end of file diff --git a/pylint_django/tests/input/func_noerror_foreignkeys.py b/pylint_django/tests/input/func_noerror_foreignkeys.py index 21b8ce26..ff77c044 100644 --- a/pylint_django/tests/input/func_noerror_foreignkeys.py +++ b/pylint_django/tests/input/func_noerror_foreignkeys.py @@ -7,6 +7,10 @@ from django.db.models import ForeignKey, OneToOneField +class Genre(models.Model): + name = models.CharField(max_length=100) + + class Author(models.Model): author_name = models.CharField(max_length=100) @@ -17,8 +21,10 @@ class ISBN(models.Model): class Book(models.Model): book_name = models.CharField(max_length=100) - author = models.ForeignKey('Author', on_delete=models.CASCADE) - isbn = models.OneToOneField(ISBN, on_delete=models.CASCADE) + # Check this works with and without `to` keyword + author = models.ForeignKey(to='Author', on_delete=models.CASCADE) + isbn = models.OneToOneField(to=ISBN, on_delete=models.CASCADE) + genre = models.ForeignKey(Genre, on_delete=models.CASCADE) def get_isbn(self): return self.isbn.value @@ -32,7 +38,7 @@ class Fruit(models.Model): class Seed(models.Model): - fruit = ForeignKey(Fruit, on_delete=models.CASCADE) + fruit = ForeignKey(to=Fruit, on_delete=models.CASCADE) def get_fruit_name(self): return self.fruit.fruit_name @@ -56,3 +62,11 @@ class UserPreferences(models.Model): https://github.com/PyCQA/pylint-django/issues/35 """ user = ForeignKey('User', on_delete=models.CASCADE) + + +class UserAddress(models.Model): + user = OneToOneField(to='User', on_delete=models.CASCADE) + line_1 = models.CharField(max_length=100) + line_2 = models.CharField(max_length=100) + city = models.CharField(max_length=100) + postal_code = models.CharField(max_length=100) diff --git a/pylint_django/transforms/foreignkey.py b/pylint_django/transforms/foreignkey.py index 544bb6d7..e69ae252 100644 --- a/pylint_django/transforms/foreignkey.py +++ b/pylint_django/transforms/foreignkey.py @@ -1,3 +1,5 @@ +from itertools import chain + from astroid import MANAGER, nodes, InferenceError, inference_tip, UseInferenceDefault from astroid.nodes import ClassDef, Attribute @@ -21,7 +23,10 @@ def is_foreignkey_in_class(node): def infer_key_classes(node, context=None): - for arg in node.args: + keyword_args = [kw.value for kw in node.keywords] + all_args = chain(node.args, keyword_args) + + for arg in all_args: # typically the class of the foreign key will # be the first argument, so we'll go from left to right if isinstance(arg, (nodes.Name, nodes.Attribute)):