详解Django的 get_or_create() 函数:获取或创建一个对象

  • Post category:Python

Django的get_or_create()函数是一个非常有用的函数,它可以在数据库中查找一个对象,如果存在则返回该对象,如果不存在则创建并返回一个新对象。它的定义如下:

get_or_create(defaults=None, **kwargs)

其中,**kwargs是用来查找对象的关键字参数,defaults=None是可选的,用于在创建新对象时指定默认值。该函数的作用是根据查找条件查询数据库,如果符合条件的记录存在,则返回该记录;如果不存在,则创建一个新的记录,返回该新记录。下面我们来详细讲解其使用方法:

  1. 使用get_or_create()查找一个对象

假设我们有一个Book模型,它有一个唯一的isbn字段,我们希望根据isbn字段查找或创建一个Book对象,可以使用如下代码:

book, created = Book.objects.get_or_create(isbn='9787121367209', defaults={
    'name': 'Python Web开发:测试驱动方法', 'author': 'Harry J.W. Percival'
})

这里,get_or_create()会根据isbn字段查询数据库,如果找到了一条记录,就将该记录返回到book变量中,同时created变量的值为False(因为记录已经存在)。如果查找失败,则创建一条新的记录并返回到book变量中,同时created变量的值为True。如果使用了defaults参数,则它所包含的键值对用于在创建新记录时指定默认值。在上面的例子中,如果没有找到记录,则会创建一条新的记录,并设置默认的书名和作者名。

  1. 使用get_or_create()在ManyToMany关系的模型中创建关联

假设我们有一个Author模型和一个Book模型,它们之间存在ManyToMany关系,我们需要在创建作者和书籍时将它们关联起来,可以使用如下代码:

author, created = Author.objects.get_or_create(name='San Zhang')
book, created = Book.objects.get_or_create(isbn='9787121367209', defaults={
    'name': 'Python Web开发:测试驱动方法', 'author': 'Harry J.W. Percival'
})

author.books.add(book)

在上面的例子中,我们先创建了一个名为San Zhang的作者,并将其赋值给author变量中。接着,我们创建了一本书,并将其赋值给book变量中。在创建书籍时,我们使用了defaults参数,指定了书名和作者名。最后,我们使用add()方法将作者和书籍关联起来。如果这本书已经存在,则会直接将关联添加到数据库中;如果不存在,则会创建一条新记录并添加关联。

  1. 使用get_or_create()在父子级关系的模型中创建对象

假设我们有一个Category模型和一个Product模型,它们之间存在父子级关系(Category模型是Product模型的外键),可以使用如下代码来创建对象:

category, created = Category.objects.get_or_create(name='书籍')
product, created = Product.objects.get_or_create(name='Python Web开发:测试驱动方法', price=49.90, category=category)

在上面的例子中,我们先创建了一个名为书籍的分类,并将其赋值给category变量。接着,我们创建了一本书,并将其赋值给product变量中。在创建书籍时,我们指定了书名、价格和分类(也就是上面创建的Category对象),这样就可以将书籍和分类关联起来。如果这个分类已经存在,则会直接将关联添加到数据库中;如果不存在,则会创建一条新记录,并添加关联。

综上所述,get_or_create()函数可以方便地查询数据库并创建新对象,非常适用于一些复杂的情况下。