Adds better id and pk handling (#791)

This commit is contained in:
Nikita Sobolev
2021-12-18 13:09:22 +03:00
committed by GitHub
parent 4a0dd04611
commit b883e192e4
2 changed files with 101 additions and 7 deletions

View File

@@ -0,0 +1,66 @@
- case: test_access_to_id_field_through_self_if_no_primary_key_defined
main: |
from myapp.models import MyModel
x = MyModel.objects.get(id=1)
reveal_type(x.id) # N: Revealed type is "builtins.int*"
reveal_type(x.pk) # N: Revealed type is "builtins.int*"
MyModel.objects.get(pk=1)
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
def __str__(self):
reveal_type(self.id) # N: Revealed type is "builtins.int*"
reveal_type(self.pk) # N: Revealed type is "builtins.int*"
- case: test_access_to_id_field_through_self_if_primary_key_is_defined
main: |
from myapp.models import MyModel
x = MyModel.objects.get(id='a')
reveal_type(x.id) # N: Revealed type is "builtins.str*"
reveal_type(x.pk) # N: Revealed type is "builtins.str*"
MyModel.objects.get(pk='a')
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
id = models.CharField(max_length=10, primary_key=True)
def __str__(self):
reveal_type(self.id) # N: Revealed type is "builtins.str*"
reveal_type(self.pk) # N: Revealed type is "builtins.str*"
- case: test_access_to_id_field_through_self_if_primary_key_has_different_name
main: |
from myapp.models import MyModel
x = MyModel.objects.get(primary='a')
reveal_type(x.primary) # N: Revealed type is "builtins.str*"
reveal_type(x.pk) # N: Revealed type is "builtins.str*"
x.id # E: "MyModel" has no attribute "id"
MyModel.objects.get(pk='a')
MyModel.objects.get(id='a') # E: Cannot resolve keyword 'id' into field. Choices are: primary
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class MyModel(models.Model):
primary = models.CharField(max_length=10, primary_key=True)
def __str__(self):
reveal_type(self.primary) # N: Revealed type is "builtins.str*"
reveal_type(self.pk) # N: Revealed type is "builtins.str*"
self.id # E: "MyModel" has no attribute "id"