Django upgrade from 3.2 to 4.2 results in AttributeError: 'SmallIntegerField' object has no attribute 'model'

I am relatively new to Django.
I took on the ‘challenge’ of upgrading one of our systems that is in Django 3.2 to Django 4.2
I learnt quite a bit in the process.
I used @adamchainz django-upgrade to upgrade some of the files.
Ran the tests also. However, some of the tests are erroring out with the foll message:
AttributeError: ‘SmallIntegerField’ object has no attribute ‘model’
Can someone guide me to where I can find a solution to address this in https://docs.djangoproject.com/en/4.2/releases/4.0/

Thanks in advance

It may help if you posted the code of the test that is failing (both the original version and the version that was modified by django-upgrade), the code that the test is testing (again, before and after), and the complete error message being generated.

1 Like

Field.model is an optional attribute, only set for fields attached to models. It’s set in Field.contribute_to_class(). Something has likely changed with a SmallIntegerField you’re using that is no longer attached to a model, such as the fields used in ORM expressions. Perhaps you’re reusing such a field, in your code or a third-party package.

As Ken said, the full stack trace will help debug this issue more. Maybe you can even find the responsible code by reading the trace in detail.

1 Like

Here is the full stack trace. Infact django-upgrade did not make mods to the tests.py or the corresponding helper.

Error
Traceback (most recent call last):
File “/home/rama0050/PycharmProjects/csrde_project/app/transactions/tests/tests.py”, line 52, in test_can_view_lineitem_notes
generate_membership_lineitem(transaction)
File “/home/rama0050/PycharmProjects/csrde_project/app/transactions/tests/helpers.py”, line 5, in generate_membership_lineitem
lineitem = LineItem.objects.create(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/manager.py”, line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/query.py”, line 658, in create
obj.save(force_insert=True, using=self.db)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/base.py”, line 814, in save
self.save_base(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/base.py”, line 892, in save_base
post_save.send(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/dispatch/dispatcher.py”, line 176, in send
return [
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/dispatch/dispatcher.py”, line 177, in
(receiver, receiver(signal=self, sender=sender, **named))
File “/home/rama0050/PycharmProjects/csrde_project/app/transactions/signals.py”, line 11, in save_transaction_amount
instance.transaction.save()
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/base.py”, line 814, in save
self.save_base(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/base.py”, line 861, in save_base
pre_save.send(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/dispatch/dispatcher.py”, line 176, in send
return [
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/dispatch/dispatcher.py”, line 177, in
(receiver, receiver(signal=self, sender=sender, **named))
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/auditlog/receivers.py”, line 31, in log_update
old = sender.objects.get(pk=instance.pk)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/manager.py”, line 87, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/query.py”, line 633, in get
num = len(clone)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/query.py”, line 380, in len
self._fetch_all()
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/query.py”, line 1881, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/query.py”, line 91, in iter
results = compiler.execute_sql(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/sql/compiler.py”, line 1547, in execute_sql
sql, params = self.as_sql()
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/sql/compiler.py”, line 734, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup(
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/sql/compiler.py”, line 85, in pre_sql_setup
order_by = self.get_order_by()
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/sql/compiler.py”, line 457, in get_order_by
for expr, is_ref in self._order_by_pairs():
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/sql/compiler.py”, line 339, in _order_by_pairs
selected_exprs[expr] = pos_expr
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/expressions.py”, line 502, in hash
return hash(self.identity)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/utils/functional.py”, line 57, in get
res = instance.dict[self.name] = self.func(instance)
File “/home/rama0050/PycharmProjects/csrde_project/env/lib/python3.9/site-packages/django/db/models/expressions.py”, line 487, in identity
if value.name and value.model:
AttributeError: ‘SmallIntegerField’ object has no attribute ‘model’