Django的get_or_create()
函数是一个非常有用的函数,它可以在数据库中查找一个对象,如果存在则返回该对象,如果不存在则创建并返回一个新对象。它的定义如下:
get_or_create(defaults=None, **kwargs)
其中,**kwargs
是用来查找对象的关键字参数,defaults=None
是可选的,用于在创建新对象时指定默认值。该函数的作用是根据查找条件查询数据库,如果符合条件的记录存在,则返回该记录;如果不存在,则创建一个新的记录,返回该新记录。下面我们来详细讲解其使用方法:
- 使用
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
参数,则它所包含的键值对用于在创建新记录时指定默认值。在上面的例子中,如果没有找到记录,则会创建一条新的记录,并设置默认的书名和作者名。
- 使用
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()
方法将作者和书籍关联起来。如果这本书已经存在,则会直接将关联添加到数据库中;如果不存在,则会创建一条新记录并添加关联。
- 使用
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()
函数可以方便地查询数据库并创建新对象,非常适用于一些复杂的情况下。