Django数据库关系实战:一对一、一对多与多对多模型配置

闻溪
闻溪
发布时间:2026-10-11| 5人浏览过
原创

Django框架通过ORM机制处理数据库关系,核心包含一对一、一对多和多对多三种模式。本文通过具体模型定义、迁移命令及视图代码,演示如何在Django中配置并操作这些关系。

一对一关系 (One-to-One)

一对一关系用于描述两个模型之间严格的一一对应。在Django中,通常通过 OneToOneField 实现,并将该字段设为主键。

模型定义

from django.db import models

class One(models.Model):
  oname = models.CharField(max_length=20, null=True)
  oage = models.CharField(max_length=20, null=True)
  odate = models.DateField(null=True)

class Two(models.Model):
  # OneToOneField 建立一对一关联,主键设为关联字段
  # on_delete=models.CASCADE 确保父表数据删除时,子表数据同步删除
  tsub = models.OneToOneField(One, on_delete=models.CASCADE, primary_key=True)
  tfond = models.CharField(max_length=20, null=True)
  tdes = models.CharField(max_length=200, null=True)

数据操作与验证

在 views.py 中,通过 objects.create() 写入数据,并利用 get() 方法验证关联:

from django.shortcuts import render
from .models import One, Two

def index(request):
  # 创建关联数据
  o1 = One.objects.create(oname='张三', oage=11, odate='2011-11-11')
  o2 = One.objects.create(oname='张三2', oage=12, odate='2012-12-12')
  t1 = Two.objects.create(tsub=o1, tfond='o1', tdes='我喜欢o1')
  t2 = Two.objects.create(tsub=o2, tfond='o2', tdes='我喜欢o2')
  return render(request, 'index.html')

def select(request):
  # 通过 One 的字段反向查询 Two
  t1 = Two.objects.get(tsub__oname='张三')
  return render(request, 'index.html', {'t1': t1})

注意:完成数据写入后,建议注释添加数据的代码,避免每次访问重复插入。

一对多关系 (One-to-Many)

一对多关系通过 ForeignKey 实现,常用于“一个人对应多张卡”的场景。

模型定义

from django.db import models

class People(models.Model):
  name = models.CharField(max_length=50)
  card_num = models.IntegerField(default=0)

class Card(models.Model):
  number = models.CharField(max_length=20)
  # ForeignKey 建立一对多关系,级联删除
  person = models.ForeignKey(People, on_delete=models.CASCADE)
  source = models.CharField(max_length=50)

路由与视图配置

在 urls.py 中配置路由:

from django.contrib import admin
from django.urls import path
from myApp import views
urlpatterns = [
  path('admin/', admin.site.urls),
  path('add/', views.add),
  path('select/', views.select),
]

在 views.py 中处理数据:

from django.shortcuts import render
from .models import People, Card
from django.http import HttpResponse

def add(request):
  # 示例:创建人与卡的关系
  # p1 = People.objects.create(name='小王', card_num=4)
  # c1 = Card(number='101', source='中国银行', person=p1)
  # c1.save()
  return HttpResponse('添加成功')

def select(request):
  # 通过卡号查找对应的人
  c1 = Card.objects.get(number='203')
  print(c1.person.name)
  # 通过ID查找人,并获取该人的所有卡
  c2 = Card.objects.get(id=3)
  print(c2.person.name)
  result = c2.person.card_set.all()
  for res in result:
    print(res.source)
  return HttpResponse('查询成功')

多对多关系 (Many-to-Many)

多对多关系(如书与出版社)通过 ManyToManyField 实现。Django会自动创建中间表,无需手动定义。

模型定义

from django.db import models

class Publication(models.Model):
  pname = models.CharField(max_length=200)
  paddress = models.CharField(max_length=200)

class Book(models.Model):
  bname = models.CharField(max_length=200)
  bauthor = models.CharField(max_length=200)
  # ManyToManyField 建立多对多关系
  publication = models.ManyToManyField(Publication)

数据操作

from django.shortcuts import render
from .models import Publication, Book
from django.http import HttpResponse

def add(request):
  # 示例:关联书籍与出版社
  # p1 = Publication(pname='大象出版社', paddress='河南')
  # p1.save()
  # b1 = Book(bname='海底两万里', bauthor='赵四')
  # b1.save()
  # b1.publication.add(p1)
  return HttpResponse('添加成功')

def select(request):
  # 通过书籍查找出版社
  b1 = Book.objects.get(bname='童年')
  b1_publication = b1.publication.all()
  for pub in b1_publication:
    print(pub.pname)
    print(pub.paddress)
  # 通过出版社查找书籍
  p1 = Publication.objects.get(pname='清华出版社')
  all_book = p1.book_set.all()
  for book in all_book:
    print(book.bname)
    print(book.bauthor)
  return HttpResponse('查找成功')

数据库迁移与配置

定义模型后,需执行迁移命令创建数据库表:

python manage.py makemigrations
python manage.py migrate

若使用MySQL,需在项目中配置驱动:

import pymysql
pymysql.install_as_MySQLdb()

以上就是Django中数据库关系(一对一、一对多、多对多)的详细内容,更多关于Django模型配置的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。