Django一对一 ,一对多,多对多

目录

在这里插入图片描述

app01/models.py

from django.db import models


# Create your models here.
# 1.继承 models.Model
# 卖家
class Seller(models.Model):
    id = models.AutoField(primary_key=True)  # 主键自动增长
    username = models.CharField(max_length=32)  # 字符串
    age = models.IntegerField()  # 年龄
    gender = models.BooleanField(default=True)  # 默认值是True 代表男
    phone = models.CharField(max_length=32)  # 电话
    email = models.EmailField()  # 邮箱类型
    # headimg = models.ImageField(default='1.jpg')  # 图片类型 需要下载pillow 模块配合使用。
    headimg = models.CharField(max_length=128, default='1.jpg')  # 保存图片路径
    address = models.CharField(max_length=128)  # 地址


# 店铺
class Store(models.Model):
    # id  默认会自动添加
    name = models.CharField(max_length=32)  # 店铺名称
    address = models.CharField(max_length=128)  # 地址
    desc = models.CharField(max_length=128)  # 描述
    logo = models.CharField(max_length=128, default='1.jpg')  # logo
    # 店铺和卖家是一对一关系
    # to:属性是关联的表格名称,on_delete属性是删除策略,级联删除
    seller = models.OneToOneField(to='Seller', on_delete=models.CASCADE)


# 商品类型
class GoodsType(models.Model):
    name = models.CharField(max_length=32)  # 类型名称
    logo = models.CharField(max_length=128, default='1.jpg')  # 商品图片,用于前台显示

# 商品
class Goods(models.Model):
    name = models.CharField(max_length=32)  # 名称
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 价格 max_digits=5 总共5位,decimal_places=2 小数2位
    bzq = models.IntegerField()  # 保质期
    sczq = models.DateField(null=True, blank=True)  # 生产日期  null=True, blank=True 空
    image = models.CharField(max_length=128, default='1.jpg')  # 商品图片
    desc = models.TextField()  # 商品描述
    # 设置外键 关系
    # 商品和类型之间的关系
    goodstype = models.ForeignKey(to=GoodsType, on_delete=models.CASCADE)
    # 商品和店铺的关系
    store = models.ForeignKey(to=Store, on_delete=models.CASCADE, null=True, blank=True)


# 多对多
# 老师和学生多对多
class Student(models.Model):
    name = models.CharField(max_length=32)


class Teacher(models.Model):
    name = models.CharField(max_length=32)
    # 设置关系
    students = models.ManyToManyField(to=Student)

app01/views.py

from django.db.models import Q, F, Count
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from app01 import models


def register(request):
    if request.method == 'POST':
        # 1.获取表单提交的内容
        name = request.POST.get('name')
        password = request.POST.get('password')
        gender = request.POST.get('gender')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        address = request.POST.get('address')
        # 2.保存到数据库
        # 第一种方式
        # seller_obj = models.Seller()
        # seller_obj.username = name
        # seller_obj.password = password
        # seller_obj.phone = phone
        # seller_obj.address = address
        # seller_obj.gender = gender
        # seller_obj.email = email
        # seller_obj.save()
        # 第二种方式:
        models.Seller.objects.create(username=name,
                                     password=password,
                                     phone=phone,
                                     address=address,
                                     gender=gender,
                                     email=email)
        # 3.返回
        return HttpResponse('注册成功了...')

    return render(request, 'register.html')


# 删除操作
def delete_person(request):
    models.Seller.objects.get(id=1).delete()
    return HttpResponse('删除成功了...')


# 更新操作
def update_person(request):
    # 第一种方式:使用 save()
    # seller_obj = models.Seller.objects.get(id=2)
    # seller_obj.username = 'zhangsan'
    # seller_obj.password = '222'
    # seller_obj.save()
    # 第二种方式:使用update()
    ret = models.Seller.objects.filter(id=2).update(username='zs')
    # print(ret, type(ret))  # <class 'django.db.models.query.QuerySet'>
    return HttpResponse('修改成功了...')


def findall(request):
    ret=models.Seller.objects.all()
    print(ret)
    return HttpResponse("查询所有数据........")
def find(request):
    # 1. get() 直接返回当前对象, 只能返回一个对象,一般使用唯一标识
    ret = models.Seller.objects.get(id=2)
    # print(ret)
    # 2. filter(), 过滤,返回一个QuerySet类型的对象。当成列表使用即可
    # ret = models.Seller.objects.filter(password='222')
    # print(ret)  # <QuerySet [<Seller: Seller object (2)>]>
    # print(ret[1].username)

    return HttpResponse('查询成功了...')
# 条件查询
def Filtle(req):
    # 排序  class类名.objects.order_by('字段名')   (-字段名)表示降序
    print(models.Seller.objects.order_by("-id").all()) #<QuerySet [<Seller: Seller object (3)>, <Seller: Seller object (2)>]>
    #获取第一条数据 class类名.objects.first()
    print(models.Seller.objects.first()) #Seller object (2)
    # 获取最后一条数据 class类名.objects.last()
    print(models.Seller.objects.last())  # Seller object (3)
    #双下划线  字段__gte 大于等于 字段__gt 大于  字段__lt 小于 字段__lte 小于等于   字段__startswith 以什么开头
    print(models.Seller.objects.filter(id__gte=1).all()) #<QuerySet [<Seller: Seller object (2)>, <Seller: Seller object (3)>]>

    #聚合函数:aggregate
    #平均值 aggregate(Avg('字段'))
    #数目 aggregate(Count('字段'))

    #F和Q查询
    #性别是男而且电话是123的消费者
    print(models.Seller.objects.filter(gender=True,phone='123').all()) #<QuerySet [<Seller: Seller object (3)>]>
    #电话是123或者用户名是123的消费者
    print(models.Seller.objects.filter(Q(username=True) | Q(phone='123')).all()) #<QuerySet [<Seller: Seller object (3)>]>

    #F使用:同一张表格的不同字段进行比较
    print(models.Seller.objects.filter(username__lt=F('phone')).first())#None
    #分组查询
    #查询不同性别的人数
    print(models.Seller.objects.all().values('gender').annotate(Count('gender'))) #<QuerySet [{'gender': True, 'gender__count': 2}]>
    return HttpResponse("条件.........")

# 一对一
def onetoone(request):
    # 1.添加关系
    # 创建卖家
    seller_obj = models.Seller()
    seller_obj.username = 'wangwu'
    seller_obj.age = 18
    seller_obj.email = '110@qq.com'
    seller_obj.gender = True
    seller_obj.phone = '110'
    seller_obj.address = '南沙'
    seller_obj.save()
    # 创建店铺
    store_obj = models.Store()
    store_obj.name = '湛江烧烤'
    store_obj.address = '湛江'
    store_obj.desc = '天下第一烧烤'
    store_obj.seller = seller_obj  # 直接赋值对象,进行关系关联
    store_obj.save()

    return HttpResponse('okaaa')


# 查询
def onetoone2(request):
    # 正向查询
    # 查询 湛江烧烤对应的卖家
    store_obj = models.Store.objects.filter(name='湛江烧烤').first()
    # print(store_obj)
    seller_obj = store_obj.seller
    print(seller_obj)  # Seller object (1)
    print(seller_obj.username) #wangwu
    # 反向
    # 查询wangwu 对应的店铺
    seller_obj = models.Seller.objects.filter(username='wangwu').first()
    store_obj = seller_obj.store  # 直接类名小写即可。
    print(store_obj)  # Store object (1)

    return HttpResponse('okaaa')


def onetoone3(request):
    seller_obj = models.Seller.objects.filter(username='wangwu').first()
    seller_obj.delete()  # 级联删除对应的店铺
    return HttpResponse('okaaa')


# 一对多
def onotomany(request):
    # 创建商品类型类型
    goodstype_obj = models.GoodsType(name='海鲜类')
    goodstype_obj.save()
    # 创建商品
    goods_obj1 = models.Goods(name='小龙虾', price=12.11, bzq=20, desc='大一点的小龙虾', goodstype=goodstype_obj)
    goods_obj1.save()
    goods_obj2 = models.Goods(name='波士顿龙虾', price=113.11, bzq=30, desc='小了点的大龙虾', goodstype=goodstype_obj)
    goods_obj2.save()

    return HttpResponse('oookkk')


# 查询
def onotomany2(request):
    # 正向查询
    # 1.小龙虾商品类型
    goods_obj = models.Goods.objects.filter(name='小龙虾').first()
    print(goods_obj)
    goodstype_obj = goods_obj.goodstype  # 直接通过关系属性查到对应的商品类型对象
    print(goodstype_obj)
    # 反向查询
    # 2.查询海鲜类对应的所有的商品
    goodstype_obj = models.GoodsType.objects.filter(name='海鲜类').first()
    # 反向查询: 类名小写_set.条件
    print(goodstype_obj.goods_set.all())

    return HttpResponse('oookkk')


# 多对多添加关系

def manytomay(request):
    teacher_obj1 = models.Teacher(name='扣王')
    teacher_obj2 = models.Teacher(name='狗哥')
    student_obj1 = models.Student(name='zs')
    student_obj2 = models.Student(name='lsi')
    teacher_obj1.save()
    teacher_obj2.save()
    student_obj1.save()
    student_obj2.save()
    # 使用 对象.关系属性.add(对象1,对象2...)
    teacher_obj1.students.add(student_obj1, student_obj2)
    teacher_obj2.students.add(student_obj1, student_obj2)

    return HttpResponse('okkk...')


def manytomay2(request):
    # 查询狗哥 教过的学生
    # 正向查询
    # teacher_obj = models.Teacher.objects.filter(name='狗哥').first()
    # print(teacher_obj.students.all())
    # 反向查询:
    # zs 被哪些老师教过
    student_obj = models.Student.objects.filter(name='zs').first()
    ret = student_obj.teacher_set.all()
    print(ret)
    return HttpResponse('okkk...')

app01/urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('register',views.register),
    path('delete_person',views.delete_person),
    path('update_person',views.update_person),
    path('findall',views.findall),
    path('find',views.find),
    path('Filtle',views.Filtle),
    path('one/',views.onetoone),
    path('one2/',views.onetoone2),
    path('one3/',views.onetoone3),
    path('many/',views.onotomany),
    path('many2/',views.onotomany2),
    path('many2/',views.onotomany2),
    path('many_many/',views.manytomay),
    path('many_many2/',views.manytomay2),
]

Python_Django/urls.py


from django.contrib import admin
from django.urls import *
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('app01.urls')),
]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值