【发布时间】:2023-03-18 21:10:02
【问题描述】:
所以我以不同的方式使用 Django 模型,我在 MS SQL 服务器中有现有的表,我想为我的应用程序访问它们。我一直在关注复数方面的一些教程,而且 https://docs.djangoproject.com/en/1.11/howto/legacy-databases/。我按照相应的步骤准备好我的模型,当我使用“迁移”命令时,我收到了这个错误
“AssertionError:一个模型不能有多个 AutoField。”
所以我查阅了 SO 并得到了 Django 的另一个文档
默认情况下,Django 为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
这是一个自动递增的主键。
如果您想指定自定义主键,只需指定 primary_key=True 在您的一个字段上。如果 Django 看到你 显式设置 Field.primary_key,它不会添加自动 id 列。
每个模型只需要一个字段来使 primary_key=True(要么 显式声明或自动添加)。
所以通过他的解决方案,我在没有主键的表中添加了“id”列,并跳过了那些有主键的表。 我的“迁移”命令运行顺利。
但是当我尝试测试是否可以从中获取值时,它显示 Invalid column 'ID'
现在,我一直在想,如果 Django 隐式创建它们,或者当我在模型中显式创建它们时(然后使用 makemigrations 和 migrate 命令),它不应该为它创建列吗?
另一种情况: 已经建立了一些具有主键的表,我已经尝试对它们进行查询并且它有效。
这只是让我想如果我错过了所有这些之间的一步,
这是我的库文件
certifi==2016.2.28
Django==1.11.3
django-mssql==1.8
django-pyodbc-azure==1.11.0.0
mysqlclient==1.3.12
PyMySQL==0.7.9
pyodbc==4.0.17
pytz==2017.2
wincertstore==0.2
很抱歉格式错误,但如果我错过了连接旧系统的任何步骤,请提供帮助。请询问是否需要任何额外信息。谢谢!
编辑:正如所问,这是我的查询工作的模型
class DjangoSession(models.Model):
session_key = models.CharField(primary_key=True, max_length=40)
session_data = models.TextField()
expire_date = models.DateTimeField()
class Meta:
managed = False
db_table = 'django_session'
这是一个(许多)不起作用的
class table1(models.Model):
id=models.AutoField(primary_key=True)
col2 = models.CharField(db_column='col2', max_length=255, blank=True, null=True) # Field name made lowercase. Field renamed to remove unsuitable characters.
col3 = models.IntegerField(db_column='col3', blank=True, null=True) # Field name made lowercase.
col4 = models.CharField(max_length=250, blank=True, null=True)
col5 = models.DateTimeField(db_column='col5') # Field name made lowercase.
class Meta:
managed = True
db_table = 'table1'
session_key 变量已经在表中,因此我不需要为该表创建主键。
然而,id=models.AutoField(primary_key=True) 已被我添加,因为我阅读了各种文档,我也尝试了创建 id 的“隐式添加”方法,但它给出了相同的结果。
引入此错误的 sql shell 查询:
from app.models import table1
table1.objects.filter(column_name='col3')
migration.createModel函数如下
migrations.CreateModel(
name='VikalpFtrFeatureCr',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('col2', models.CharField(blank=True, db_column='col2', max_length=255, null=True)),
('col3', models.IntegerField(blank=True, db_column='col3', null=True)),
('col4', models.CharField(blank=True, max_length=250, null=True)),
('col5', models.DateTimeField(db_column='UPDATE_DTTM')),
],
options={
'managed': False,
'db_table': 'VIKALP_FTR_Feature_CR',
},
)
【问题讨论】:
-
您能否发布您在添加
AutoField之前拥有的模型之一,以及将其更改为 之后的模型“我已将 'id' 列添加到不'没有主键". -
在您的问题中添加
models.py -
我将与模型一起编辑问题,谢谢。
-
看到
managed元类属性的区别了吗? -
1.难道不应该这样django可以将id列添加到表中吗? 2.Tried managed=False 在有问题的表上,仍然没有进展
标签: python sql-server django django-models