Hello,
project was written in django 1.6 and recently migrated to django 1.8.15. 
It works quite well but project tests showed a failure during executing 
line:
            objs = Agent.objects.filter(Q(first_name__icontains=term) | 
Q(last_name__icontains=term) | Q(accord_id__icontains=term) | 
Q(company__icontains=term))


Traceback (most recent call last):
  File 
".../project/local/lib/python2.7/site-packages/django/core/handlers/base.py", 
line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/views/generic/base.py", 
line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 57, in dispatch
    return super(Select2View, self).dispatch(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/views/generic/base.py", 
line 89, in dispatch
    return handler(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 76, in get
    self.get_results(request, term, page, context)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 194, in get_results
    return field.get_results(request, term, page, context)
  File ".../project/project/app/fields.py", line 33, in get_results
    objs = Agent.objects.filter(Q(first_name__icontains=term) | 
Q(last_name__icontains=term) | Q(accord_id__icontains=term) | 
Q(company__icontains=term))
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/manager.py", 
line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/query.py", 
line 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/query.py", 
line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1310, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1332, in _add_q
    current_negated, allow_joins, split_subq)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1338, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1150, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1036, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, 
self.get_meta())
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1407, in names_to_path
    for int_model in opts.get_base_chain(model):
TypeError: 'NoneType' object is not iterable
Internal Server Error: /some/json/file.json
Traceback (most recent call last):
  File 
".../project/local/lib/python2.7/site-packages/django/core/handlers/base.py", 
line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/views/generic/base.py", 
line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 57, in dispatch
    return super(Select2View, self).dispatch(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/views/generic/base.py", 
line 89, in dispatch
    return handler(request, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 76, in get
    self.get_results(request, term, page, context)
  File 
".../project/local/lib/python2.7/site-packages/django_select2/views.py", 
line 194, in get_results
    return field.get_results(request, term, page, context)
  File ".../project/project/app/fields.py", line 33, in get_results
    Q(company__icontains=term))
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/manager.py", 
line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/query.py", 
line 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/query.py", 
line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1310, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1332, in _add_q
    current_negated, allow_joins, split_subq)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1338, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1150, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1036, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, 
self.get_meta())
  File 
".../project/local/lib/python2.7/site-packages/django/db/models/sql/query.py", 
line 1407, in names_to_path
    for int_model in opts.get_base_chain(model):
TypeError: 'NoneType' object is not iterable


But in django 1.6 all works well. So i make some inspection.
In project there is a class Agent (class Agent(AbstractUser, 
AnotherClass):), metaclass Agent2Metaclass (class 
Agent2Metaclass(models.base.ModelBase):) and class Agent2 (class 
Agent2(TimeStampedModel):) using Agent2Metaclass:


class Agent(AbstractUser, AnotherClass):
    ....
    CHANGE_FIELDS_WITH_APPROVAL= ('first_name', 'last_name', 'email', ... )

    ....


class Agent2Metaclass(models.base.ModelBase):
    def __new__(cls, name, bases, attrs):
        attrs = collections.OrderedDict(attrs)
        for field in Agent.CHANGE_FIELDS_WITH_APPROVAL:
            attrs[field] = Agent._meta.get_field(field)
        return super(Agent2Metaclass, cls).__new__(cls, name, bases, attrs)


class Agent2(TimeStampedModel):
    __metaclass__ = Agent2Metaclass

    agent = models.OneToOneField(Agent)
    ....


And now what is going on showed in console:

Django 1.6:

        In [1]: from app.models import Agent

        In [2]: print Agent._meta.fields
        [<django.db.models.fields.AutoField: id>, 
<django.db.models.fields.CharField: password>, 
<django.db.models.fields.DateTimeField: last_login>, 
<django.db.models.fields.BooleanField: is_superuser>, 
<django.db.models.fields.CharField: username>, ...]

        In [3]: print Agent._meta.fields[2]
        <django.db.models.fields.DateTimeField: last_login>

        In [4]: print Agent._meta.fields[3]
        <django.db.models.fields.BooleanField: is_superuser>

        In [5]: print Agent._meta.fields[4]
        <django.db.models.fields.CharField: username>

        In [6]: print Agent._meta.fields[5]
        <django.db.models.fields.CharField: first_name>

        In [7]: print Agent._meta.fields[6]
        <django.db.models.fields.CharField: last_name>

        In [8]: print type(Agent._meta.fields[6])
        <class 'django.db.models.fields.CharField'>

        In [9]: print Agent._meta.fields[3]
        <django.db.models.fields.BooleanField: is_superuser>

        In [10]: print Agent._meta.fields[3].__class__
        <class 'django.db.models.fields.BooleanField'>

        In [11]: print Agent._meta.fields[3].__class__.__class__
        <type 'type'>

        In [12]: print Agent.objects.filter(first_name="Petr")
        [<Agent: John Adams>, <Agent: Igor Hnizdo>, '...(remaining elements 
truncated)...']


Django 1.8:

        In [1]: from app.models import Agent

        In [2]: print Agent._meta.fields
        (<django.db.models.fields.AutoField: id>, 
<django.db.models.fields.CharField: password>, 
<django.db.models.fields.DateTimeField: last_login>, 
<django.db.models.fields.BooleanField: is_superuser>, 
<django.db.models.fields.CharField: username>, 
<django.db.models.fields.CharField: first_name>, ...)

        In [3]: print Agent._meta.fields[1]
        app.Agent.password

        In [4]: print Agent._meta.fields[2]
        app.Agent.last_login

        In [5]: print Agent._meta.fields[3]
        app.Agent.is_superuser

        In [6]: print Agent._meta.fields[4]
        app.Agent.username

        In [7]: print Agent._meta.fields[5]
        app.Agent2.first_name
        #this seems to me as strange behaviour - why is field of Agent 
presented as field of Agent2?

        In [8]: print Agent._meta.fields[5].__class__
        <class 'django.db.models.fields.CharField'>

        In [9]: print Agent._meta.fields[4].__class__
        <class 'django.db.models.fields.CharField'>

        In [10]: from app.models import Agent2

        In [11]: print Agent2.objects.filter(first_name="Petr")
        [<Agent2: Petr Pavel>, <Agent2: Petr Petrovic>, <Agent2: Petr 
Cech>, ...]

        In [12]: print Agent.objects.filter(first_name="Petr")
        
--------------------------------------------------------------------------------------------------------------------------------
        TypeError Traceback (most recent call last)
        and errors like above are shown.


It seems like fields of Agent were changed during execution of 
Agent2Metaclass in order to set _forward_fields_map[] in 
django.db.models.options. Fields of Agent are set to Agent before executing 
the Agent2Metaclass.
And the error appears in django.db.models.sql.query in def names_to_path 
because opts.get_base_chain(model) is None or NoneType.
If i paste a condition "if opts.get_base_chain(model) is not None:" before 
the for cycle it seems it works ok. But it is a good solution?
It is OK when some fields of Agent are set as fields of Agent2 after 
executing Agent2Metaclass?
It is a good behaviour of django, that the 
Agent.object.filter(first_name="Petr") ends with error?
If i am wrong, how can i filter Agent?

Thank you.





===========================================================================================================
===========================================================================================================
===========================================================================================================

List from def names_to_path (before my if condition) during 
Agent.object.filter("somestring") in django 1.6:
-------------------------------
model: None
names: ['session_key']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: None
names: ['expire_date']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: None
names: ['pk']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: None
names: ['first_name']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: None
names: ['last_name']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: None
names: ['company']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: None
names: ['date_joined']
opts: app.agent
opts.model: <class 'app.models.Agent'>



List from def names_to_path (before my if condition) during 
Agent.object.filter("somestring") in django 1.8:
-------------------------------
model: <class 'django.contrib.sessions.models.Session'>
names: ['session_key']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: <class 'django.contrib.sessions.models.Session'>
names: ['session_key']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: <class 'django.contrib.sessions.models.Session'>
names: ['expire_date', 'gt']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: <class 'django.contrib.sessions.models.Session'>
names: ['expire_date']
opts: sessions.session
opts.model: <class 'django.contrib.sessions.models.Session'>

-------------------------------
model: <class 'app.models.Agent'>
names: ['pk']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent'>
names: ['pk']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['first_name', 'icontains']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['first_name']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['last_name', 'icontains']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['last_name']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['company', 'icontains']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent2'>
names: ['company']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-------------------------------
model: <class 'app.models.Agent'>
names: ['date_joined']
opts: app.agent
opts.model: <class 'app.models.Agent'>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/c38ce259-e32a-4328-a0f3-1557ebf9e542%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to