本文介绍: 在这个示例中,Order 模型中的主键是 ‘order_id’ 和 ‘customer_id两个字段组合我们使用djangocomposite-foreignkey 库中的 CompositeForeignKey 来定义一个联合外键,将 customer 字段与 Customer 模型关联起来。例如,如果有一个作者”(Author模型一个书籍”(Book模型,你可以在“书籍模型定义一个外键,将其指向作者”模型的主键。这样,每个书籍可以一个作者关联起来。

Django model 外键实现

主键: 在 Django 中,如果你没有显式地指定一个模型的主键,Django自动为其创建一个名为 “id” 的主键字段,这个字段是一个自增长的整数类型。因此,如果在 Author 模型中没有显式地指定主键,那么它的主键就是自动生成的 “id字段

外键(ForeignKey):在 Django 中,表和表之间可以通过外键(ForeignKey)来进行关联外键是一种将一个表中的字段与另一个表中的字段进行关联的方法。在 Django 中,外键通常定义在一个模型中,它指向另一个模型的主键primary key),从而建立了两个模型之间的关系。

一对一关系(OneToOneField):一对一关系就是指一个模型实例只能与另一个模型实例对应。在 Django 中,你可以使用 OneToOneField定义一对一关系。

多对多关系(ManyToManyField):多对多关系就是指一个模型实例可以多个其他模型实例对应,而一个其他模型实例可以多个该模型实例相对应。在Django 中,你可以使用 ManyToManyField来定义多对多关系。多对多关系通常需要通过一个中间表来实现,这个中间表记录两个模型实例之间的对应关系。

联合主键(CompositeKey):联合主键是指将多个字段一起作为主键来唯一标识一个模型实例。在 Django 中,默认情况下不支持联合主键,但你可以使用第三方库来实现联合主键的功能

  1. 外键(ForeignKey)

例如,如果有一个“作者”(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=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在这个示例中,Book 模型中的 author 字段是一个外键,它指向 Author 模型的主键。on_delete=models.CASCADE 参数表示,当一个作者被删除时,与之相关的所有书籍都将被删除(即级联删除)。这样,你就可以通过 Book 模型的 author 字段来访问与之关联的 Author 模型的数据。例如,如果你有一个 book 实例,你可以通过 book.author 来访问其关联的作者实例。

  1. 一对一关系(OneToOneField)

假设我们两个模型:Person 和 Passport,每个人只有一个护照,每个护照只属于一个人,这就是一对一关系。在 Django
中,你可以使用 OneToOneField 来定义这种关系,例如:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)

class Passport(models.Model):
    number = models.CharField(max_length=20)
    person = models.OneToOneField(Person, on_delete=models.CASCADE)

在这个示例中,Passport 模型中的 person 字段是一个 OneToOneField,它指向 Person
模型。这样,每个护照都可以与一个人关联起来,而每个人也只有一个护照。

  1. 多对多关系(ManyToManyField)

假设我们两个模型:Student 和 Course,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就是多对多关系。在Django 中,你可以使用 ManyToManyField 来定义这种关系,例如:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)
    courses = models.ManyToManyField(Course)

class Course(models.Model):
    name = models.CharField(max_length=100)

在这个示例中,Student 模型中的 courses 字段是一个 ManyToManyField,它指向 Course 模型。这样,每个学生可以选修多门课程,而每门课程也可以被多个学生选修。

  1. 联合主键(CompositeKey)

假设我们有一个模型:Order,它有两个字段:order_id 和 customer_id,这两个字段一起作为主键来唯一标识一个订单。在 Django 中,默认情况下不支持联合主键,但你可以使用第三方库来实现联合主键的功能,例如 djangocomposite-foreignkey

from django.db import models
from compositefk.fields import CompositeForeignKey

class Customer(models.Model):
    name = models.CharField(max_length=100)

class Order(models.Model):
    order_id = models.IntegerField()
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    customer_id = models.IntegerField()
    class Meta:
        primary_key = CompositeKey('order_id', 'customer_id')

在这个示例中,Order 模型中的主键是 ‘order_id’ 和 ‘customer_id’ 两个字段的组合我们使用djangocomposite-foreignkey 库中的 CompositeForeignKey 来定义了一个联合外键,将 customer 字段与 Customer 模型关联起来。这样,每个订单都可以唯一地由 ‘order_id’ 和 ‘customer_id’ 两个字段来标识

  1. __str__函数
from django.db import models

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

    def __str__(self):
        return self.name

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

    def __str__(self):
        return self.title

__str__是一个 Python 中的特殊方法用于确定对象字符串表示形式。在 Django 模型中,__str__方法通常用于定义模型的人类可读表示形式,以便管理界面和其他地方显示模型对象使用

在这个示例中,Book 模型包含一个外键字段,它指向 Author 模型。这个外键字段将 Book 模型与 Author 模型关联起来,并且指定了n_delete=models.CASCADE 参数,以确保当关联的作者记录删除时,与之关联的书籍记录也被删除

例如,如果我们在 Django 管理界面查看一个名为 “John Doe” 的作者对象,它将显示为 “John Doe” 而不是默认的对象表示形式,如 <Author: Author object (1)>。

  1. 数据迁移
python manage.py makemigrations
python manage.py migrate

原文地址:https://blog.csdn.net/qq_38393271/article/details/131508578

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_13231.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注