Django 一对一关系

作用:

  • 两个数据库表建立外键关系
  • 当外键表的数据被删除时,主表的数据也会一并删除。

1,添加表模型

复制代码
Test/app8/views.py
复制代码
from django.db import models

class User(models.Model):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=128)  # 使用哈希存储密码
    first_name = models.CharField(max_length=60)
    last_name = models.CharField(max_length=50)
    # 添加其他字段,例如:
    # age = models.IntegerField()
    # bio = models.TextField()
    # ...

    class Meta:
        db_table = 'users2'

    def __str__(self):
        return self.username


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

    def __str__(self):
        return self.name

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

    def __str__(self):
        return f"{self.passport_number} - {self.person.name}"

2,执行迁移命令

复制代码
python manage.py makemigrations app8
python manage.py migrate app8

使用迁移命令会生成Person和Passport两个张模型表,Passport表中生成一个外键,命名为person_id

3,执行测试脚本增加数据库表实例

Test/scripts.py

复制代码
# create_instances.py

import os
import django
from datetime import date

# 设置 Django 环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')
django.setup()

from app8.models import Person, Passport

# 创建一个 Person 实例
person = Person.objects.create(name="test2", age=30)

# 创建一个 Passport 实例,并关联到上面的 Person 实例
passport = Passport.objects.create(person=person, passport_number="A12345678", issue_date=date(2023, 6, 30))

# 打印结果
print(f"Created Person: {person.name}, Age: {person.age}")
print(f"Created Passport: {passport.passport_number}, Issue Date: {passport.issue_date}")

分别执行脚本,创建了两条数据

4,添加视图函数

Test/app8/views.py

复制代码
from django.shortcuts import render
from .models import User


def create_user(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        email = request.POST.get('email')
        # ... 获取其他字段的值

        # 创建用户实例
        user = User(
            username=username,
            email=email,
            # ... 填充其他字段
        )
        user.save()  # 保存到数据库
        # ... 处理成功或失败的逻辑
    return render(request, '8/1.html')


from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from app8.models import Person, Passport

def delete_person(request, person_id):
    person_to_delete = get_object_or_404(Person, id=person_id)
    person_to_delete.delete()

    return HttpResponse("Person and associated Passport have been deleted.")

5,添加路由地址

复制代码
from django.urls import path
from . import views


urlpatterns = [
    path('create_user', views.create_user, name='create_user'),
    path('delete_person/<int:person_id>/', views.delete_person, name='delete_person'),

]

6,访问页面,删除person数据示例

http://127.0.0.1:8000/app8/delete_person/2/

查看数据库,app8_passport,app8_person表,person_id 为2的数据被删除了

通过对比数据可以看到,通过路由传递的person_id为2时,数据库app8_passport表对应的person_id为2的数据被删除了,app8_person表id为2的数据也一并被删除了。

本文已有实现删除数据示例,以下是插入数据,展示数据示例补充内容:

Django 模型创建的两表插入数据-CSDN博客

Django 页面展示模型创建表的数据-CSDN博客

相关推荐
Muyuan19985 小时前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
Muyuan19981 天前
27.RAG 系统中的上下文充分性判断:从 Chunk 数量、FAISS 距离到 LLM Relevance Gate
python·django·pdf·fastapi·faiss
程序媛徐师姐1 天前
Python基于Django的小区果蔬预定系统【附源码、文档说明】
python·django·小区果蔬预定系统·果蔬预定·python小区果蔬预定系统·小区果蔬预定·python果蔬预定系统
码界筑梦坊2 天前
111-基于Python的中国旅游用户数据可视化分析系统
python·信息可视化·django·毕业设计·旅游
YJlio2 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
小熊Coding2 天前
懂车帝汽车销售数据可视化分析系统
python·信息可视化·django·汽车·数据可视化分析·懂车帝·汽车销售数据分析
ma_de_hao_mei_le3 天前
ntquerysystemiunfomation 数据传递
django
Muyuan19983 天前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
Muyuan19983 天前
25.Paper RAG Agent 优化记录:上传反馈、计算器安全与 Chunk 参数调整
python·安全·django·sqlite·fastapi
Muyuan19983 天前
26.Paper RAG Agent 展示面收口:截图与项目表达更新记录
人工智能·python·django·fastapi