Sin*_*son 5 sql-server django django-models pyodbc django-pyodbc
我正在使用 MSSQL 中的旧数据库。我们有一个表,其中有两列导致我出现问题:
class Emp(models.Model):
empid = models.IntegerField(_("Unique ID"), unique=True, db_column=u'EMPID')
ssn = models.CharField(_("Social security number"), max_length=10, primary_key=True, db_column=u'SSN') # Field name made lowercase.
Run Code Online (Sandbox Code Playgroud)
所以该表以 ssn 列作为主键,django 生成的 SQL 更新代码的相关部分是这样的:
UPDATE [EMP] SET [EMPID] = 399,
.........
WHERE [EMP].[SSN] = 2509882579
Run Code Online (Sandbox Code Playgroud)
问题是 EMP.EMPID 是 MSSQL 中的一个标识字段,因此每当我尝试将更改保存到现有员工时,pyodbc 都会抛出此错误:
ProgrammingError: ('42000', "[42000] [Microsoft][SQL Native Client][SQL Server]C
annot update identity column 'EMPID'. (8102) (SQLExecDirectW); [42000] [Microsof
t][SQL Native Client][SQL Server]Statement(s) could not be prepared. (8180)")
Run Code Online (Sandbox Code Playgroud)
将 EMP.EMPID 作为标识对程序的任何内容都不是至关重要的,因此通过创建临时列和复制、删除、重命名来删除它似乎是合乎逻辑的事情。这为将老客户转移到 Django 中创建了一个额外的步骤,所以我的问题是,有什么方法可以防止 Django 在我对这个表进行更新时生成 '[EMPID] = XXX' 片段?
编辑
我已经像这样修补了我的模型:
def save(self, *args, **kwargs):
if self.empid:
self._meta.local_fields = [f for f in self._meta.local_fields if f.name != 'empid']
super().save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这是有效的,利用 Django 在 django/db/models/base.py (525) 中填充它的 sql-sentence 的方式。如果有人有更好的方法或可以解释为什么这是不好的做法,我会很高兴听到它!
这个问题很老,辛德里找到了一个可行的解决方案,但我想提供一个解决方案,我已经在生产中使用了几年,不需要在_meta.
我必须编写一个与包含许多计算字段的现有业务数据库集成的 Web 应用程序。这些字段通常用于计算记录的状态,几乎用于整个应用程序中的每个对象访问,并且 Django 必须能够使用它们。
这些类型的字段可与模型管理器一起使用,该管理器将所需的字段添加到带有extra(select=...).
ComputedFieldsManager代码片段:https : //gist.github.com/manfre/8284698
class Emp(models.Model):
ssn = models.CharField(_("Social security number"), max_length=10, primary_key=True, db_column=u'SSN') # Field name made lowercase.
objects = ComputedFieldsManager(computed_fields=['empid'])
# the empid is added on to the model instance
Emp.objects.all()[0].empid
# you can also search on the computed field
Emp.objects.all().computed_field_in('empid', [1234])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |