Django ORM。 Django如何知道新创建记录的自动递增的pk

时间:2018-07-25 02:22:12

标签: mysql django

假设Book表具有两个字段idnameid是自动递增的pk。 数据库后端是mysql

在Django中。

book = Book.objects.create(name="Tender Is the Night")

Django如何知道新书的ID。

Django将哪些SQL语句发送给Mysql服务器?

仅插入语句?如果是这样,insert语句是否会返回新创建的书的ID?

1 个答案:

答案 0 :(得分:0)

这是MySQL的功能。参见https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
  

没有为AUTO_INCREMENT列指定任何值,因此MySQL自动分配了序列号。

Django使用相关的数据库API(在本例中为MySQL)找出最后插入的ID:

  

您可以使用AUTO_INCREMENT SQL函数或LAST_INSERT_ID() C API函数来检索最近自动生成的mysql_insert_id()值。这些函数是特定于连接的,因此它们的返回值不受也执行插入操作的另一个连接的影响。

有关详细信息,请参见相关的源代码:https://github.com/django/django/blob/master/django/db/models/base.py#L874

def _do_insert(self, manager, using, fields, update_pk, raw):
        """
        Do an INSERT. If update_pk is defined then this method should return
        the new pk for the model.
        """
        return manager._insert([self], fields=fields, return_id=update_pk,
                               using=using, raw=raw)