Django数据库关系实战:一对一、一对多与多对多模型配置
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模型配置的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













