我有一个DB Schema,我从一些遗留代码继承而来。现在我们打算使用Django将表格反映到模型中。这意味着我不能使用django模型生成表。表模式如下所示: -
mysql> desc student_profile;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| joining_on | datetime | YES | | NULL | |
| brothername | varchar(45) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
现在我为这个模式创建的Django模型如下所示: -
class StudentProfile(models.Model):
id=models.IntegerField(primary_key=True)
joining_on=models.DateField()
brothername=models.CharField(max_length=45)
class Meta:
db_table="student_profile"
当我在其中插入一行时,如下所示: -
StudentProfile.objects.insert(brothername="Bro")
正确插入行。但我没有办法提取id字段。看来,由于此字段不是AutoField
,因此django不会复制由MySql自动生成的ID。如何获取创建行的id
值?我检查了(https://code.djangoproject.com/ticket/8799#comment:1),这似乎是设计上的。但是我仍然需要一种方法来访问id
并将其反映在StudentProfile
模型中。我该怎么办?
一种解决方案可能是覆盖默认save()
并明确将id
提供给模型的save()
。但这是正确的方法吗?数据库(它是MySql)提供了一种生成id的方法,我必须能够利用这个事实,而不是必须通过应用程序维护一个运行的计数器。任何提示?
答案 0 :(得分:8)
您可以完全跳过定义id
列,即:
class StudentProfile(models.Model):
# id=models.IntegerField(primary_key=True)
joining_on=models.DateField()
brothername=models.CharField(max_length=45)
class Meta:
db_table="student_profile"
Django默认会创建或使用名为id
的自动增量列,与您的旧列相同。
如果列名称不同,您可以使用名称不同的AutoField
,例如:
my_id = models.AutoField(primary_key=True)