Skip to content

Commit 34da2f6

Browse files
committed
Support ForeignKey relations with to keyword
1 parent b61fee3 commit 34da2f6

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

pylint_django/tests/input/func_noerror_foreignkeys.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
from django.db.models import ForeignKey, OneToOneField
88

99

10+
class Genre(models.Model):
11+
name = models.CharField(max_length=100)
12+
13+
1014
class Author(models.Model):
1115
author_name = models.CharField(max_length=100)
1216

@@ -17,8 +21,9 @@ class ISBN(models.Model):
1721

1822
class Book(models.Model):
1923
book_name = models.CharField(max_length=100)
20-
author = models.ForeignKey('Author', on_delete=models.CASCADE)
21-
isbn = models.OneToOneField(ISBN, on_delete=models.CASCADE)
24+
author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
25+
isbn = models.OneToOneField(to=ISBN, on_delete=models.CASCADE)
26+
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
2227

2328
def get_isbn(self):
2429
return self.isbn.value
@@ -32,7 +37,7 @@ class Fruit(models.Model):
3237

3338

3439
class Seed(models.Model):
35-
fruit = ForeignKey(Fruit, on_delete=models.CASCADE)
40+
fruit = ForeignKey(to=Fruit, on_delete=models.CASCADE)
3641

3742
def get_fruit_name(self):
3843
return self.fruit.fruit_name
@@ -56,3 +61,11 @@ class UserPreferences(models.Model):
5661
https://github.com/PyCQA/pylint-django/issues/35
5762
"""
5863
user = ForeignKey('User', on_delete=models.CASCADE)
64+
65+
66+
class UserAddress(models.Model):
67+
user = OneToOneField(to='User', on_delete=models.CASCADE)
68+
line_1 = models.CharField(max_length=100)
69+
line_2 = models.CharField(max_length=100)
70+
city = models.CharField(max_length=100)
71+
postal_code = models.CharField(max_length=100)

pylint_django/transforms/foreignkey.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from itertools import chain
2+
13
from astroid import MANAGER, nodes, InferenceError, inference_tip, UseInferenceDefault
24
from astroid.nodes import ClassDef, Attribute
35

@@ -21,7 +23,10 @@ def is_foreignkey_in_class(node):
2123

2224

2325
def infer_key_classes(node, context=None):
24-
for arg in node.args:
26+
keyword_args = [kw.value for kw in node.keywords]
27+
all_args = chain(node.args, keyword_args)
28+
29+
for arg in all_args:
2530
# typically the class of the foreign key will
2631
# be the first argument, so we'll go from left to right
2732
if isinstance(arg, (nodes.Name, nodes.Attribute)):

0 commit comments

Comments
 (0)