Skip to content

Commit ff45cdb

Browse files
committed
Fixes #223 Support ForeignKey relations with to keyword
1 parent b61fee3 commit ff45cdb

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@
1010
* [bittner](https://github.com/bittner)
1111
* [federicobond](https://github.com/federicobond)
1212
* [matusvalo](https://github.com/matusvalo)
13+
* [fadedDexofan](https://github.com/fadeddexofan)

pylint_django/tests/input/func_noerror_foreignkeys.py

Lines changed: 17 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,10 @@ 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+
# Check this works with and without `to` keyword
25+
author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
26+
isbn = models.OneToOneField(to=ISBN, on_delete=models.CASCADE)
27+
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
2228

2329
def get_isbn(self):
2430
return self.isbn.value
@@ -32,7 +38,7 @@ class Fruit(models.Model):
3238

3339

3440
class Seed(models.Model):
35-
fruit = ForeignKey(Fruit, on_delete=models.CASCADE)
41+
fruit = ForeignKey(to=Fruit, on_delete=models.CASCADE)
3642

3743
def get_fruit_name(self):
3844
return self.fruit.fruit_name
@@ -56,3 +62,11 @@ class UserPreferences(models.Model):
5662
https://github.com/PyCQA/pylint-django/issues/35
5763
"""
5864
user = ForeignKey('User', on_delete=models.CASCADE)
65+
66+
67+
class UserAddress(models.Model):
68+
user = OneToOneField(to='User', on_delete=models.CASCADE)
69+
line_1 = models.CharField(max_length=100)
70+
line_2 = models.CharField(max_length=100)
71+
city = models.CharField(max_length=100)
72+
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)