【Django入门】数据库开发以及Models.py编写规则

文章目录

  • 简介
  • 创建一个Model
  • Field类型
  • 完整性约束
  • Model方法
  • 数据库迁移
  • 数据的操作(更新、删除、添加)
    • 1. 添加数据
    • 2. 更新数据
    • 3. 删除数据
    • 4. 关联表查询
  • 结论

简介

在Django中,models.py是定义数据模型的地方。Django的ORM(Object-Relational Mapping)系统会根据models.py中的定义创建数据库表,并提供一个Python API来操作这些表。

创建一个Model

在models.py中创建一个Model非常简单。我们只需要定义一个Python类,并继承自django.db.models.Model类即可。例如:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

在这个例子中,我们定义了一个Person类,并继承自django.db.models.Model类。我们还定义了三个属性:first_name、last_name和email。这些属性都是django.db.models.Model类中的Field子类。

Field类型

Django提供了多种Field类型,用于定义不同类型的数据。以下是一些常见的Field类型:

Field类型 用途
CharField 用于存储字符串。
IntegerField 用于存储整数。
FloatField 用于存储浮点数。
BooleanField 用于存储布尔值。
DateField 用于存储日期。
DateTimeField 用于存储日期和时间。
EmailField 用于存储电子邮件地址。
TextField 用于存储大文本数据。

在定义一个Field时,我们可以指定它的一些选项,例如最大长度、默认值、是否可为空等等。例如:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(unique=True)
    age = models.IntegerField(default=18)
    bio = models.TextField(blank=True)

在这个例子中,我们给email属性指定了unique=True选项,表示这个属性的值必须是唯一的。我们还给age属性指定了default=18选项,表示这个属性的默认值为18。最后,我们给bio属性指定了blank=True选项,表示这个属性可以为空。

完整性约束

完整性约束是一种保证数据库中数据的一致性和有效性的机制。在 Django 中,可以通过在 models.py 中定义模型时使用一些特殊的字段选项来实现完整性约束。以下是一些示例:

  1. 主键约束:每个模型都必须有一个主键字段,可以使用 AutoField 或者 BigAutoField 来实现自动增长的主键,也可以使用 UUIDField 来实现全局唯一的主键。
class MyModel(models.Model):
    id = models.BigAutoField(primary_key=True)
    # other fields
  1. 唯一约束:可以使用 UniqueConstraint 或者 unique=True 来实现唯一约束,确保某个字段的值在整个表中是唯一的。
class MyModel(models.Model):
    field1 = models.CharField(max_length=30, unique=True)
    field2 = models.CharField(max_length=30)
    
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['field1', 'field2'], name='unique_fields')
        ]
  1. 外键约束:可以使用 ForeignKey 来实现外键约束,确保某个字段的值必须是另一个表的主键值。
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
  1. 检查约束:可以使用 CheckConstraint 来实现检查约束,确保某个字段的值符合特定的条件。
class MyModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.IntegerField()
    
    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(field1__gte=0) & models.Q(field2__gte=0), name='positive_fields')
        ]

这些只是一些简单的例子,实际上还有很多其他的完整性约束可以使用,如非空约束、默认值约束等等。在 Django 中,可以使用模型字段选项和 Meta 类中的 constraints 属性来实现这些约束。

Model方法

除了Field属性之外,我们还可以在Model中定义一些方法。这些方法可以用于操作Model的数据,或者为Model提供一些额外的功能。例如:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(unique=True)
    age = models.IntegerField(default=18)
    bio = models.TextField(blank=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

在这个例子中,我们定义了一个__str__()方法,用于返回Person对象的字符串表示。当我们在Django的管理后台中查看Person对象时,就会使用这个方法返回的字符串来表示这个对象。
假设我们已经创建了一个名为personPerson对象,我们可以通过以下方式使用__str__函数:

print(person)

这将打印出person对象的first_namelast_name属性的值,以及一个空格,如下所示:

John Doe

如果您希望使用__str__函数来自定义打印输出,您可以更改Person类中的__str__函数的实现方式。例如,以下代码将在对象的字符串表示中包括年龄和生物信息:

def __str__(self):
    return f"{self.first_name} {self.last_name} ({self.age}): {self.bio}"

这将打印出person对象的first_namelast_name属性的值,后跟其age属性的值,再后跟其bio属性的值,如下所示:

John Doe (25): A software engineer with a passion for photography.

数据库迁移

在我们定义了一个Model之后,我们需要使用Django的数据库迁移工具来创建数据库表。我们可以使用以下命令来生成迁移文件:

python manage.py makemigrations

然后使用以下命令来应用迁移:

python manage.py migrate

这些命令会根据models.py中的定义来生成数据库表,并将这些表创建在数据库中。

数据的操作(更新、删除、添加)

对于Django中的数据更新、添加和删除,可以使用ORM(对象关系映射)进行操作。ORM是一种将数据库操作转化为对象操作的技术,可以使得我们在Python中直接操作数据库,而不需要编写SQL语句。

下面是一些常见的ORM操作:

1. 添加数据

使用ORM添加数据非常简单,只需要创建一个Model对象并调用save()方法即可,例如:

from myapp.models import MyModel

obj = MyModel(name='John', age=25)
obj.save()

2. 更新数据

使用ORM更新数据也很简单,只需要获取到要更新的对象并修改其属性值,然后调用save()方法即可,例如:

from myapp.models import MyModel

obj = MyModel.objects.get(id=1)
obj.name = 'Peter'
obj.save()

3. 删除数据

使用ORM删除数据也很简单,只需要获取到要删除的对象并调用delete()方法即可,例如:

from myapp.models import MyModel

obj = MyModel.objects.get(id=1)
obj.delete()

4. 关联表查询

在Django中,我们可以使用ForeignKey和ManyToManyField等Field类型来定义模型之间的关系,然后使用ORM进行关联表查询。

例如,如果我们有两个模型,一个是Author,一个是Book,它们之间是一对多的关系,那么可以这样定义:

from django.db import models

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

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

然后,我们可以使用ORM进行关联表查询,例如:

from myapp.models import Author, Book

# 获取所有作者及其写的书籍
authors = Author.objects.all()
for author in authors:
    books = author.book_set.all()
    print(author.name, [book.title for book in books])

以上是一些基本的ORM操作,如果需要更详细的信息,可以查看Django官方文档中关于ORM的部分。

结论

在Django中,models.py是定义数据模型的地方。我们可以在这里定义Model的属性、方法和Field类型。Django的ORM系统会根据这些定义来创建数据库表,并提供一个Python API来操作这些表。在使用Django时,熟练掌握models.py的编写规则是非常重要的。

你可能感兴趣的:(python,django,python,后端)