How do I make Django insert an ID value into a field that I specify (models pulled from existing DB)?

Viewed 89

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?

0 Answers
Related