了解 Django 中的数据库关系

小新小新 in 新闻 2022-11-13 21:17:42

正确设置表关系是创建可靠数据模型的关键。

数据库关系描述了不同数据库表之间的连接。这些关系决定了如何存储和检索数据。Django 与关系数据库系统 (RDBMS) 配合得很好。因此,它支持数据库表关系。

关系的类型取决于应用程序的要求及其建模的数据。Django 模型和数据库之间的良好关系改善了数据维护。这包括提高查询性能和减少数据重复。

您可以通过探索三种主要的关系类型来了解 Django 数据库关系如何影响应用程序性能。

数据库关系

关系数据库系统支持三种类型的数据库关系。这些关系是一对多、多对多和一对一的。数据库关系的类型会影响应用程序的用例。

Django 模型代表应用程序中的数据库表。您必须在表之间建立良好的关系才能创建良好的数据库系统。数据库关系决定了如何在应用程序中存储和呈现数据。

要了解数据库关系,首先要创建一个名为 Hoods 的 Django 项目。该应用程序将是一个社区社交网络。它将管理各个社区的社交活动、安全和企业。

居民可以注册、登录和创建个人资料。他们还可以创建帖子和商业广告供所有人查看。

首先,创建一个存储所有社区数据的数据库。然后,您将创建 Profile、NeighborHood、Business 和 Post 模型。要创建模型,您必须确定数据库表所需的关系。

一对一的数据库关系

一对一的关系意味着一个 Django 模型中的记录与另一个模型中的另一个记录相关。这两个记录相互依赖。在这种情况下,Profile 模型依赖于 User 模型来创建常驻配置文件。

因此,在应用程序上注册的每个居民只能有一个个人资料。此外,没有用户,配置文件就无法存在。



from django.db import models

from django.contrib.auth.models import User

 

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')

    name = models.CharField(max_length=80, blank=True)

    bio = models.TextField(max_length=254, blank=True)

    profile_picture = CloudinaryField('profile_picture', default='default.png')

    location = models.CharField(max_length=50, blank=True, null=True)

    email = models.EmailField(null=True)

 

    def __str__(self):

        return f'{self.user.username} profile'

Django 的 User 模型是 Django 中内置的身份验证模型。您不必为它创建模型。相反,从 django.contrib.auth 导入它。Profile 模型上的 OneToOneField()定义了一对一的关系。

on_delete =models.CASCADE 参数防止删除这些记录之一。您必须从两个表中删除记录。

您可以使用 Django 管理界面来可视化应用程序中的关系。要登录 Django 管理员,您必须注册为管理员用户,称为超级用户。

通过在终端上运行以下命令来创建超级用户:



python manage.py createsuperuser

将提示输入您的用户名、电子邮件和密码。完成后,启动服务器。

使用 URL http://127.0.0.1:8000/admin 在浏览器中打开管理页面。

您将看到管理页面,您可以在其中使用您之前创建的凭据登录。登录后,您将看到组和用户对象。Django 身份验证框架管理这两个模型。在底部,您将看到 Profile 模型。

打开配置文件模型并继续添加配置文件。您将看到它如下所示:

django-database-relationships

请注意,您可以选择为用户创建配置文件。OneToOneField() 数据类型允许您为经过身份验证的用户创建配置文件。这就是应用程序管理一对一关系的方式。

一对多关系

一对多关系意味着模型中的一个记录与另一个模型中的许多记录相关联。它也被称为多对一关系。

在您的情况下,一位管理员可以创建多个社区。但是每个社区只能属于一个管理员。您可以使用 ForeignKey 数据类型来定义这种关系。

Django 有一个内置的管理界面。您不必为它创建模型。管理员有权从管理面板管理内容和可视化应用程序。

容纳许多记录的模型将具有 ForeignKey。它将关系定义为一对多。下面的代码显示了放置密钥的位置。



class NeighbourHood(models.Model):

    admin = models.ForeignKey("Profile", on_delete=models.CASCADE, related_name='hood')

    name = models.CharField(max_length=50)

    location = models.CharField(max_length=60)

    hood_logo = CloudinaryField('hood_logo', default='default.png')

    description = models.TextField()

    health_tell = models.IntegerField(null=True, blank=True)

    police_number = models.IntegerField(null=True, blank=True)

    Count= models.IntegerField(null=True, blank=True)

 

    def __str__(self):

        return f'{self.name} hood'

您可以在应用程序上看到如图所示的关系:

django-database-relationships

NeighborHood 模型现在有一个管理员。任何人要创建社区,都必须拥有管理员权限。一个社区不能有很多管理员。

多对多数据库关系

在多对多 关系中,一个模型中的许多记录与另一个模型中的其他记录相关联。例如,Post 和 Business 模型可以有多个彼此的记录。用户可以在他们的帖子中制作多个商业广告,反之亦然。

但是,创建多对多关系可能会导致数据不准确。在其他框架中,您必须创建一个新表来连接这两个表。

Django 对此有一个解决方案。当您使用多对多字段时,它会创建一个将两个表映射在一起的新表。您可以将多对多字段放在两个模型中的任何一个中,但不应该在两个模型中。



class Post(models.Model):

    title = models.CharField(max_length=120, null=True)

    post = models.TextField()

    date = models.DateTimeField(auto_now_add=True)

    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='post_owner')

    hood = models.ForeignKey(NeighbourHood, on_delete=models.CASCADE, related_name='hood_post')

    business = models.ManyToManyField(Business)

 

    def __str__(self):

        return f'{self.title} post'

现在,当您在管理面板上查看帖子模型时,您可以将多个企业附加到一个帖子。

Post-model-now-has-option

Django 简化数据库关系

您用于应用程序的数据库类型决定了如何利用数据。Django 有一个全面的系统,可以轻松连接和操作关系数据库。

Django 的特性使得从相关表中存储和检索数据变得容易。它具有内置的 API,可以为您的应用程序连接和创建数据库关系。

数据库关系决定了应用程序的行为。是否使用一对一、一对多或多对多关系取决于您。

使用 Django,您可以在不破坏应用程序的情况下配置和测试功能。使用 Django 保护数据库系统并优化您的开发人员体验。

-- End --