如何获取Django Models

时间:2016-03-03 10:40:54

标签: django django-models

我有一个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的方法,我必须能够利用这个事实,而不是必须通过应用程序维护一个运行的计数器。任何提示?

1 个答案:

答案 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)