1
0
forked from VimPlug/jedi

Merge branch 'django-custom-object-manager' of https://github.com/PeterJCLaw/jedi into django

This commit is contained in:
Dave Halter
2020-06-06 01:24:24 +02:00
2 changed files with 64 additions and 5 deletions

View File

@@ -110,15 +110,47 @@ def _create_manager_for(cls, manager_cls='BaseManager'):
def _new_dict_filter(cls): def _new_dict_filter(cls):
filters = cls.get_filters(is_instance=True, include_metaclasses=False) def get_manager_name(filters):
for f in filters:
names = f.get('objects')
if not names:
continue
# Found a match. Either the model has a custom manager, or we're
# now in django.db.models.Model. If the latter we need to use
# `_create_manager_for` because the manager we get from the
# stubs doesn't work right.
name = names[0] # The first name should be good enough.
parent = name.get_defining_qualified_value()
if parent.py__name__() == 'Model':
django_models_model, = cls.inference_state.import_module(
('django', 'db', 'models', 'base'),
).py__getattribute__('Model')
if django_models_model == parent:
# Don't want to use the value from the Django stubs, but
# we have found the point where they'd take precedence.
break
return name
manager = _create_manager_for(cls)
if manager:
return manager.name
filters = list(cls.get_filters(is_instance=True, include_metaclasses=False))
dct = { dct = {
name.string_name: DjangoModelName(cls, name) name.string_name: DjangoModelName(cls, name)
for filter_ in reversed(list(filters)) for filter_ in reversed(filters)
for name in filter_.values() for name in filter_.values()
} }
manager = _create_manager_for(cls)
if manager: manager_name = get_manager_name(filters)
dct['objects'] = manager.name if manager_name:
dct['objects'] = manager_name
return DictFilter(dct) return DictFilter(dct)

View File

@@ -6,9 +6,18 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
class TagManager(models.Manager):
def specially_filtered_tags(self):
return self.all()
class Tag(models.Model): class Tag(models.Model):
tag_name = models.CharField() tag_name = models.CharField()
objects = TagManager()
custom_objects = TagManager()
class Category(models.Model): class Category(models.Model):
category_name = models.CharField() category_name = models.CharField()
@@ -49,6 +58,9 @@ class BusinessModel(models.Model):
unidentifiable = NOT_FOUND unidentifiable = NOT_FOUND
def method(self):
return 42
# ----------------- # -----------------
# Model attribute inference # Model attribute inference
# ----------------- # -----------------
@@ -132,6 +144,11 @@ model_instance.unidentifiable
#! ['unidentifiable = NOT_FOUND'] #! ['unidentifiable = NOT_FOUND']
model_instance.unidentifiable model_instance.unidentifiable
#? int()
model_instance.method()
#! ['def method']
model_instance.method
# ----------------- # -----------------
# Queries # Queries
# ----------------- # -----------------
@@ -147,6 +164,16 @@ model_instance.objects.update(x='')
#? BusinessModel() #? BusinessModel()
model_instance.objects.create() model_instance.objects.create()
# -----------------
# Custom object manager
# -----------------
#? TagManager()
Tag.objects
#? TagManager()
Tag.custom_objects
# ----------------- # -----------------
# Inheritance # Inheritance
# ----------------- # -----------------