译者|BugattiDatabase关系描述了不同数据库表之间的关系。这种关系决定了数据的存储和检索方式。Django支持数据库表关系,非常适合关系数据库系统(RDBMS)。关系类型取决于应用程序的需求及其建模的数据。Django模型和数据库之间的良好关系改善了数据维护,包括提高查询性能和减少数据重复。您可以通过探索三种主要的关系类型来了解Django数据库关系如何影响应用程序性能。1.数据库关系关系数据库系统支持三种类型的数据库关系:一对多关系、多对多关系和一对一关系。数据库关系的类型影响应用程序的用例。Django模型表示应用程序中的数据库表。要创建一个好的数据库系统,必须建立良好的表与表之间的关系。数据库关系决定了数据在应用程序中的存储和显示方式。要了解数据库关系,让我们首先创建一个名为Hoods的Django项目。该应用程序将成为一个社区社交网络,管理各个社区的社交活动、安全和业务。居民可以注册、登录和创建个人资料。他们还可以创建所有人都能看到的帖子和广告。首先创建一个数据库来存储社区的所有数据。然后,您将为Profile(个人资料)、NeighborHood(社区)、Business(企业)和Post(帖子)创建模型。要创建模型,您必须确定数据库表之间所需的关系。二、一对一的数据库关系一对一的关系是指一个Django模型中的一条记录与另一个模型中的另一条记录相关联。这两个记录相互依赖。在这种情况下,个人资料模型依赖于用户模型来创建居民的个人资料。因此,在应用程序上注册的每个居民只能拥有一个个人资料。此外,没有用户就不能存在配置文件。从django.db导入模型从django.contrib.auth.models导入用户类Profile(models.Model):user=models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile')name=models.CharField(max_length=80,空白=真)bio=models.TextField(max_length=254,空白=真)profile_picture=CloudinaryField('profile_picture',默认='default.png')location=models.CharField(max_length=50,空白=真,null=True)email=models.EmailField(null=True)def__str__(self):returnf'{self.user.username}profile'Django的用户模型是Django中内置的认证模型,你不用必须为它创建一个模型。相反,从django.contrib.auth导入它。Profile模型上的OneToOneField()定义了一对一的关系。on_delete=models.CASCADE变量防止删除其中一条记录。您必须从两个表中删除记录。您可以使用Django管理界面在您的应用程序中可视化这些关系。要登录到Django管理界面,必须注册一个管理员用户,即超级用户。通过在终端中运行以下命令来创建超级用户:pythonmanage.pycreatesuperuser系统将提示您输入用户名、电子邮件和密码。完成这些操作后,启动服务器。在浏览器中使用URLhttp://127.0.0.1:8000/admin打开管理页面。您将看到管理页面并可以使用之前创建的凭据登录。登录后,您将看到Groups对象和Users对象。Django身份验证框架管理这两个模型。在底部,您将看到Profile模型。打开Profile模型并继续添加个人数据。您会看到它像这样:图1请注意,您可以选择为用户创建配置文件。OneToOneField()数据类型允许您为经过身份验证的用户创建配置文件。这就是应用程序管理一对一关系的方式。三、一对多数据库关系一对多关系是指一个模型中的一条记录与另一个模型中的多条记录相关联,也称为多对一关系。在此示例中,管理员可以创建多个社区。但是每个社区只能属于一个管理员。您可以使用ForeignKey数据类型来定义这种类型的关系。Django有一个内置的管理界面,无需为其创建模型。管理员有权从管理面板管理内容和可视化应用程序。包含许多记录的模型将有一个ForeignKey。它将关系定义为一对多关系。以下代码显示了放置密钥的位置。类NeighborHood(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):returnf'{self.name}hood'在应用上可以看到如下图所示的关系:图2NeighborHood模型有现在是管理员。任何想要创建社区的人都必须拥有管理权限。一个社区不能有多个管理员。4.多对多数据库关系在多对多关系中,一个模型中的多个记录与另一个模型中的其他记录相关联。例如,一个Post模型和一个Business模型可以有彼此的多条记录。用户可以在他们的帖子中创建多个商业广告,反之亦然。但是,创建多对多关系可能会导致数据不准确。在其他框架中,您必须创建一个新表来连接两个表。为此,Django有一个解决方法。当您使用多对多字段时,它会创建一个新表以将两个表映射在一起。您可以在任一模型中放置多对多字段,但不能同时放置在两个模型中。类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(业务)def__str__(self):returnf'{self.title}post'当您在管理面板上查看Post模型时,您现在可以将多个企业附加到一个帖子。图35.Django简化了数据库关系应用程序使用的数据库类型决定了数据的使用方式。Django有一个综合系统,可以轻松连接和操作关系数据库。Django的特性使得从相关表中存储和检索数据变得容易。它有一个内置的API来连接和创建应用程序的数据库关系。数据库关系决定了应用程序的行为。使用一对一、一对多还是多对多关系取决于您。使用Django,您可以在不破坏应用程序的情况下配置和测试功能。您可以使用Django来保护您的数据库系统并优化您的开发人员体验。原文链接:https://www.PCPC.me/django-database-relationships/
