OneToOneField 设置一对一关系
to 代表和那种模型有关系
to_field 和那种的表的那个字段关联,可以不填,默认为id
on_delete 代表关联表数据删除,对应的数据,应该作何处理
models.PROTECT 如果有外键不允许删除
models.CASCADE 如果删除关联表的数据,对应的数据被删除
如果删除storeuser的数据,store表中对应的数据删除
两张表如下所示:
from django.db import models
# Create your models here.
GENDER_STATUS={
(0,'女'),
(1,'男')
}
class StoreUser(models.Model):
#不需要定义id字段,会自动生成
username=models.CharField(max_length=32,verbose_name="用户名")
password=models.CharField(max_length=32,verbose_name="密码")
nick_name=models.CharField(max_length=32,verbose_name="昵称")
age=models.IntegerField(verbose_name="年龄",default=0)
gender=models.IntegerField(verbose_name="性别(0-女,1-男)",choices=GENDER_STATUS,default=1)
email=models.EmailField(verbose_name="邮箱",null=True)
address=models.TextField(verbose_name="地址",null=True)
create_time=models.DateTimeField(verbose_name="创建时间",auto_now=True)
class Meta:
db_table="storeuser"
#创建店铺表,与StoreUser表为一对一关系
class Store(models.Model):
store_name=models.CharField(max_length=32,verbose_name="店铺名")
store_desc=models.TextField(verbose_name="店铺描述")
store_address=models.TextField(verbose_name="店铺地址")
store_user=models.OneToOneField(to=StoreUser,on_delete=models.CASCADE)
##on_delete=代表关联表的数据被删除后,另一张表的对应数据,该如何处理
# models.CASCADE 如果删除关联表的数据,对应表的数据也会被删除
# models.PROTECT 如果有外键不允许删除
#to= 代表和哪种模型有关系
class Meta:
db_table="store"
1、增加,两种方式
storeuser = StoreUser.objects.create(username="admin",password="111",nick_name="管理员")
# 第一种方式
Store.objects.create(
store_name = "店铺01",
store_desc = "店铺01",
store_address = "北京",
store_user_id = storeuser.id
)
# 第二种
Store.objects.create(
store_name = "店铺01",
store_desc = "店铺01",
store_address = "北京",
store_user = storeuser # 对象
)
2、查询
从store的对象,查询store_user 的数据
从外键所在的模型,到另一个模型
# 查询 店铺02 的老板
# 第一种
store = Store.objects.filter(store_name="店铺02").first()
store_user_id = store.store_user_id
store_user = StoreUser.objects.get(id = store_user_id)
# 第二种
store = Store.objects.filter(store_name="店铺02").first()
store_user = store.store_user # 对象
print(store_user)
从storeuser 到store的查询
从另一个模型到外键所在的模型
# 查询admin2 用户的店铺
storeuser = StoreUser.objects.filter(username="admin2").first()
# 第一种
# store = Store.objects.filter(store_user_id = store_user.id).first()
# 第二种 一对一的模型中,可以直接使用另一个模型的类名小写
data = storeuser.store
print(data)
3、删除
根据on_delete 的属性操作,只有当on_delete属性是models.CASCADE才可以删除数据
#删除id为6的storeuser的数据
StoreUser.objects.get(id = 6).delete()