前面的博客已经对数据库的基础知识有了介绍,对数据库数据一对多的操作有了了解,现在来看看数据库的一对一操作,非常简单
数据库中建立两张表,一个账户表,一个用户表。一个账户对应一个用户,即一对一关系,
ORM数据库的一对一关系:一个表中的一条数据对应着另外一个表中的一条数据。
在创建表的时候需要介绍几个参数:
from django.db import models
class Account(models.Model):
a_name = models.CharField(max_length=20)
# 账户密码
a_pwd = models.CharField(max_length=100)
# 账户激活的时间
# DateField()参数为空,这个字段的值需要自己添加。
# auto_now=True: 当这个Account这个对象的属性被修改了,在保存的时候,这个a_register_date这个时间会自动更新为保存时间;(强调更新时间)
# auto_now_add=True: 含义就是这个时间字段,不会随着对象的修改而更新这个时间,只在这个对象被第一次创建的时候自动填充创建的时间。以后也不会再变动了。(强调创建时间)
# auto_created=True: 表示使用当前时间作为值,自动创建这个字段的值。默认是False。当创建对象的时候就不需要给这个字段赋值了,会自动创建。
a_register_date = models.DateTimeField(auto_now_add=True, auto_created=True)
a_update_date = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'account'
class Contact(models.Model):
"""
一个账户的拥有人。
"""
# 所有人的姓名
c_name = models.CharField(max_length=20)
# 所有人的住址
c_address = models.TextField()
# 所有人的联系方式
c_phone = models.CharField(max_length=20)
# 添加账户和所有人的一对一关系。
# models.CASCADE:当account表中的一条数据删除时,对应的contact表中的数据也要删除。
account = models.OneToOneField(Account, on_delete=models.CASCADE)
class Meta:
db_table = 'contact'
将models.OneToOneField写在哪一个表中,哪一个表就是从表;OneToOneField()的第一个参数就是主表;
OneToOneField不强调位置关系,两个表中任选一个作为主表,另一个作为从表;
一对一的查询
在这里插入代码片
from django.shortcuts import render
from .models import Account, Contact
from datetime import datetime
def add(request):
# 添加主表数据
a1 = Account(a_name='1@qq.com', a_pwd='123', a_register_date=datetime.now(), a_update_date=datetime.now())
a1.save()
a2 = Account(a_name='2@qq.com', a_pwd='456', a_register_date=datetime.now(), a_update_date=datetime.now())
a2.save()
# 添加从表数据
c1 = Contact(c_name='张三', c_address='北京', c_phone='111', account=a1)
c1.save()
c2 = Contact(c_name='李四', c_address='郑州', c_phone='222', account_id=a2.id)
c2.save()
return render(request, 'index.html', {'result': '数据添加成功'})
def select(request):
# 根据主表的一条数据,查询从表的一条数据。也就是查询该账户的拥有人。
account = Account.objects.get(id=2)
contact = account.contact.c_name
# 根据从表的一条数据,查询主表的一条数据。也就是查询这个人的账户。
contact = Contact.objects.get(id=2)
account = contact.account.a_name
return render(request, 'index.html', {'data': account})
def update(request):
account = Account.objects.get(id=1)
account.a_pwd = '111'
account.save()
return render(request, 'index.html', {'result': '数据修改成功'})
def delete(request):
Account.objects.get(id=1).delete()
return render(request, 'index.html', {'result': '数据删除成功'})
一对一和一对多的关系图展示