[Django] Django ORM 简直就像魔法!它能做任何事情呢(适合初学者)

该文章的目的是什么? (The purpose of this article)

试着快速了解一下Django的ORM。

ORM是什么?

Django的ORM(对象关系映射)是用于在Python对象和数据库之间交换数据的机制。
通过使用ORM,可以在Python代码中操作数据库而无需直接编写SQL。

立刻去实践部分吧?

以下是使用Django ORM进行数据库操作的一个示例。

from django.db import models

# モデルの定義
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

# データの取得
books = Book.objects.all()  # 全てのBookオブジェクトを取得する
book = Book.objects.get(pk=1)  # pk=1のBookオブジェクトを取得する

# データの追加
new_book = Book(title='Django for Beginners', author='John Smith', published_date='2022-01-01')
new_book.save()  # データベースに保存する

# データの更新
book.title = 'Django for Experts'
book.save()  # データベースに保存する

# データの削除
book.delete()  # データベースから削除する

首先,我们定义一个名为Book的类,并且继承Django的models.Model。
这个类代表数据库的表,每个属性对应数据库的列。

objects的特征值

使用objects属性,我们可以对数据库表进行数据的获取、添加、更新和删除。
通过objects.all()方法,可以获取所有数据;通过objects.get()方法,可以获取特定数据。要添加新数据,需要创建一个新的Book对象,并使用save()方法将数据保存到数据库中。要更新现有的数据,需要修改对象的属性,并调用save()方法。要删除数据,需要调用delete()方法。

ORM真是太厉害了。

使用ORM可以使您在没有SQL知识的情况下,使用Python进行数据库操作。
此外,Django的ORM通常可以更轻松地编写复杂的查询,从而能够高效地进行数据库操作。

领域的限制

使用Django的ORM可以定义数据库字段的约束。

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)

您可以在上述代码中为is_available字段设置默认值并使其成为必填项。
此外,您还可以为CharField字段设置最大长度。

领域的限制

使用Django的ORM可以定义数据库字段的约束。例如,以下是一个例子。

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)

在上述示例中,您可以将默认值设置为is_available字段,并将其设置为必需。此外,您还可以为CharField字段设置最大长度。

关系

使用Django的ORM可以定义关系。

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()

在上述中,我们定义了Book和Author的模型,并使用ForeignKey来定义Book对象和Author对象之间的一对多关系。
通过指定on_delete参数,我们可以指定在删除父对象时的操作行为。

查询过滤

使用Django的ORM可以过滤查询。

books = Book.objects.filter(author__name='John Smith')

可以使用filter()方法来获取所有著者名为“John Smith”的Book对象。
可以使用__来访问关系字段。

查询排序

使用Django的ORM可以实现查询的排序。

books = Book.objects.order_by('-published_date')

在上面的代码中,我们使用order_by()方法按照published_date字段进行降序排序。

查询的汇总

使用Django的ORM可以进行查询的聚合。

from django.db.models import Count

authors = Author.objects.annotate(num_books=Count('book')).order_by('-num_books')

在上述代码中,我们使用annotate()方法添加了一个名为num_books的新字段,并计算了每位作者的书籍数量。
Count()函数则用于计算关联字段的数量。
我们使用order_by()方法根据num_books字段进行降序排序。

经理

您可以定义自定义管理器来操作对象。

class BookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_available=True)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)
    
    objects = models.Manager() # デフォルトのマネージャー
    available_books = BookManager() # カスタムマネージャー

在上述代码中,我们定义了一个名为BookManager的自定义管理器,并添加了条件is_available=True。我们将BookManager作为新的管理器定义为available_books。对象可以使用默认的objects管理器,也可以使用available_books管理器。

自定义方法

可以为模型定义自定义方法。

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    published_date = models.DateField()
    is_available = models.BooleanField(default=True)

    def is_new(self):
        return self.published_date > datetime.date.today() - datetime.timedelta(weeks=4)

在上述中,我们添加了一个名为is_new()的方法。
该方法会在published_date在最近4周内时返回True。
通过添加这样的方法,我们能够扩展模型的功能。

P.S. 哇哦,DjangoORM真是一种魔法!

我之前一直在使用FastAPI进行开发,并且在ORM中使用了SQLAlchemy。
当时作为一个相当新手的工程师来说,英文厚厚的文档真的很痛苦。
Django的ORM已经与数据库连接起来了,可以很方便地操作数据库。
因为Django已经在幕后做得很棒了,所以我希望能够保持头脑清醒,不再被这些事情困扰?

广告
将在 10 秒后关闭
bannerAds