django_models_一对一,一对多,多对多关系

一、一对一关系:
1、个人认为一对一关系的两个表,是可以合成一个表的,只不过合在一个表长度太长了,所以分成两个表,其实这两个表可以共用一个主键
2、一对一关系可以加在两个表中任意一个表中都行,创建方式

注意:以下所有代码都只作演示,没有对输入的参数进行判断,实际工作中是要进行严格的判断的,比如说输入字符是否为空,长度,是否符合需求等

models.OneToOneField()

例如,作者和作者详情表

class Author(models.Model):
    author_name = models.CharField(max_length=10, null=False)


class AuthorDetail(models.Model):
    author_age = models.IntegerField(null=False)
    author_sex = models.IntegerField(choices=((1, "男"), (0, "女")),null=False)
    author_address = models.CharField(max_length=100,null=False)
    author = models.OneToOneField(to=Author,on_delete=models.CASCADE)

创建成功以后

image.png

image.png

image.png

image.png

AuthorDetail表格中多了一列author_id

3、一对一关系,插入数据(注意,同样只做演示,真正开发过程中要对获到的参数做严格校验,比如说是否为空,长度等等)

@api_view(["POST", ])
def api_add_author(request):
    new_author_sex = 0
    author_name = request.POST.get("author_name")
    author_age = request.POST.get("author_age")
    author_sex = request.POST.get("author_sex")
    author_address = request.POST.get("author_address")
    author = Author.objects.create(author_name=author_name)
    author_id = Author.objects.filter(id=author.id).first()
    if author_id not in [None,""]:
        if author_sex == "男":
            new_author_sex = 1
        AuthorDetail.objects.create(author=author, author_age=author_age, author_sex=new_author_sex,
                                    author_address=author_address)
        res ={"code":0,"msg":"插入成功"}
    else:
        res = {"code":1,"msg":"没有插入成功"}
    return JsonResponse(res)

4、一对一关系,查询数据
查询名子叫小明,年纪是14的作者的id

两个叫小明

image.png

image.png


我们要查到这条记录

image.png

image.png

这是我们看到了表格,也知道这条记录,那如果表格中数据多,你完全不知道数据库呢

@api_view(["POST", ])
def api_find_author(request):
    author_name = request.POST.get("author_name")
    author_age = request.POST.get("author_age")
    print("author_age = %s"%author_age)
    authors = Author.objects.filter(author_name=author_name)
    print(authors)
    ids = []
    if len(authors) > 0:
        for author in authors:
            author_details = AuthorDetail.objects.filter(author=author, author_age=int(author_age))
            if len(author_details)>0:
                for author_detail in author_details:
                    ids.append(author_detail.author_id)
        if len(ids)>0:
            res = {"code": 0, "msg": "查询成功", "id": ids}
        else:
            res = {"code": 1, "msg": "该用户不存在"}
    else:
        res = {"code": 1, "msg": "作者名不存在"}
    return JsonResponse(res)

image.png

image.png

二、一对多关系
就是外键关系,上篇文章说过了
django_models_外键应用_2021-11-12 - 简书

三、多对多关系:
例如作者和书,一个书可以有好向个作者,一个作者也可以出好几本书

class Author(models.Model):
    author_name = models.CharField(max_length=10, null=False)


class Book(models.Model):
    book_name = models.CharField(max_length=30,null=False)
    book_publisher = models.CharField(max_length=40,null=False)
    author = models.ManyToManyField(Author) #多对多关系

数据库里多了一个表格

image.png

image.png

1、插入


def api_add_book(request):
    book_name = request.POST.get("book_name")
    book_publisher = request.POST.get("book_publisher")
    book = Book.objects.create(book_name=book_name,book_publisher=book_publisher)
    book.author.create(author_name="张三")
    book.author.create(author_name="小红")
    return JsonResponse({"code":0,"msg":"创建成功"})

2、查询

def api_select_book(request):
    books = Book.objects.filter(author=11)
    for book in books:
        print(book.book_name)
    return JsonResponse({"code":0,"msg":"查询成功"})
def api_select_book(request):
    books = Book.objects.filter(author__author_name="张三")
    for book in books:
        print(book.book_name)
    return JsonResponse({"code":0,"msg":"查询成功"})

image.png

image.png

关于 一对一 一对多 多对多关系的总结
为了减少数据表格的复杂性,优先使用一对一,一对多关系,最后选用多对多关系

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值