Django数据库--一对一表操作

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()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容