Context:
I have a pre-existing database that I should not alter. I used manage.py inspectdb and pulled the models I needed into webapi/models.py.
I have the following model:
class Clerk(models.Model):
clientid = models.BigAutoField(db_column='clientId', primary_key=True)
clerkname = models.CharField(db_column='clerkName', max_length=30)
...
class Meta:
managed = False
db_table = 'Clerks'
I am not sure if I need to show any more code for this test, but I feel like I should be able to make an instance and see that an id has been assigned.
However, as per below, id is not being assigned. I have also included some troubleshooting I've done.
>>> from chokowebapi.models import Clerk
>>> Clerk.objects.all()
<QuerySet []>
>>> clerk = Clerk(clerkname="hi")
>>> clerk.clientid
Additional troubleshooting (continuation of the above snippet)
>>> clerk.save()
Traceback (most recent call last):
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\mssql\base.py", line 576, in execute
return self.cursor.execute(sql, params)
pyodbc.IntegrityError: ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert the value NULL into column 'clientId', table 'web.dbo.Clerks'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The statement has been terminated. (3621)")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\base.py", line 743, in save
self.save_base(using=using, force_insert=force_insert,
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\base.py", line 780, in save_base
updated = self._save_table(
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\base.py", line 885, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\base.py", line 923, in _do_insert
return manager._insert(
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\query.py", line 1301, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\models\sql\compiler.py", line 1441, in execute_sql
cursor.execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 99, in execute
return super().execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\mssql\base.py", line 576, in execute
return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: ('23000', "[23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert the value NULL into column 'clientId', table
'chokoweb.dbo.Clerks'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The statement has been terminated. (3621)")
I have tried changing clientid to models.IntegerField and I have also tried changing managed to True on the Meta class. I have also tried setting clientid=1 and saving, and it gave me this error:
>>> clerk.clientid=1
>>> clerk.save()
Traceback (most recent call last):
File "C:\git\django-mssql\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\git\django-mssql\venv\lib\site-packages\mssql\base.py", line 576, in execute
return self.cursor.execute(sql, params)
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Table 'Clerks' does not have the identity property. Cannot perform SET operation. (8106) (SQLExecDirectW)")
As far as I know, primary_key=True should allow django to know to increment that field on new instances. So what could I be missing?