values_list for related model id flat True (#113)

This commit is contained in:
Maxim Kurnikov
2019-07-25 21:33:45 +03:00
committed by GitHub
parent b4cd9757b0
commit 735b58e9bf
2 changed files with 21 additions and 0 deletions

View File

@@ -10,6 +10,7 @@ from mypy.types import AnyType, Instance
from mypy.types import Type as MypyType from mypy.types import Type as MypyType
from mypy.types import TypeOfAny from mypy.types import TypeOfAny
from django.db.models.fields.related import RelatedField
from mypy_django_plugin.django.context import DjangoContext from mypy_django_plugin.django.context import DjangoContext
from mypy_django_plugin.lib import fullnames, helpers from mypy_django_plugin.lib import fullnames, helpers
@@ -34,6 +35,9 @@ def get_field_type_from_lookup(ctx: MethodContext, django_context: DjangoContext
ctx.api.fail(exc.args[0], ctx.context) ctx.api.fail(exc.args[0], ctx.context)
return None return None
if isinstance(lookup_field, RelatedField) and lookup_field.column == lookup:
lookup_field = django_context.get_primary_key_field(lookup_field.related_model)
field_get_type = django_context.fields_context.get_field_get_type(helpers.get_typechecker_api(ctx), field_get_type = django_context.fields_context.get_field_get_type(helpers.get_typechecker_api(ctx),
lookup_field, method=method) lookup_field, method=method)
return field_get_type return field_get_type

View File

@@ -188,3 +188,20 @@
class Entry(models.Model): class Entry(models.Model):
text = models.CharField(max_length=100) text = models.CharField(max_length=100)
blog = models.ForeignKey(Blog, on_delete=models.CASCADE) blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
- case: values_list_flat_true_with_ids
main: |
from myapp.models import Blog, Publisher
reveal_type(Blog.objects.values_list('id', flat=True)) # N: Revealed type is 'django.db.models.query.QuerySet[myapp.models.Blog, builtins.int]'
reveal_type(Blog.objects.values_list('publisher_id', flat=True)) # N: Revealed type is 'django.db.models.query.QuerySet[myapp.models.Blog, builtins.int]'
installed_apps:
- myapp
files:
- path: myapp/__init__.py
- path: myapp/models.py
content: |
from django.db import models
class Publisher(models.Model):
pass
class Blog(models.Model):
publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE)