Django的Web开发,数据库的一对一,一对多,多对多的应用

一对一,models.OneToOneField的应用

models.py

class Person(models.Model):
    p_name=models.CharField(max_length=20)
    p_sex=models.BooleanField(default=False)

class Id_card(models.Model):
    id_num=models.CharField(max_length=18,unique=True)
    # models.CASCADE模式:主表删除,副表同步删除
    # models.PROTECT模式,主表不允许删除,除非所有副表都删除了
    # models.SET_NULL模式, 主表删除, 副表的外键关系设置为null
    id_person=models.OneToOneField(Person,null=True,blank=True,on_delete=models.CASCADE)

其中 on_delete 的属性有
models.CASCADE : 主表删除,从表同步删除
models.PROTECT模式,主表不允许删除,除非所有副表都删除了
models.SET_NULL模式, 主表删除, 副表的外键关系设置为null

views.py

def add_person(request):
    name=request.GET.get('name')
    sex=random.randrange(2)
    person=Person()
    person.p_name=name
    person.p_sex=sex
    person.save()
    return HttpResponse('新人添加成功')


def add_id(request):
    id_num=request.GET.get('num')
    id_card=Id_card()
    id_card.id_num=id_num
    id_card.save()
    return HttpResponse('idcard添加成功')


def bind(request):
    person=Person.objects.last()
    id_card=Id_card.objects.last()
    id_card.id_person=person
    id_card.save()
    return HttpResponse('人员与idcard绑定成功')


def delete_person(request):
    person=Person.objects.last()
    person.delete()
    return HttpResponse('人员删除成功,同时onetoonefield的idcard即外键也对应删除')

def delete_idcard(request):
    id_card=Id_card.objects.last()
    id_card.delete()
    return HttpResponse('idcard删除成功')


def get_person(request):
    # 通过idcard获取person,用最新的一条数据举例
    idcard=Id_card.objects.last()
    # 副表获取主表数据, 是显性属性, 即字段名
    person=idcard.id_person
    return HttpResponse('人的名字是 %s' %person.p_name)


def get_idcard(request):

    person=Person.objects.last()
    # 主获取,即获取某个副表的数据, 是隐性属性, 属性名为模型的名字(表名)
    idcard=person.id_card
    return HttpResponse('ID卡号是 %s' %idcard.id_num)

多对多的用法,models.ManyToManyField

注意主表及从表的查询,隐性属性, 显性属性的查询方法。

class Customer(models.Model):
    c_name=models.CharField(max_length=20)


class Goods(models.Model):
    g_name=models.CharField(max_length=20)
    g_customer=models.ManyToManyField(Customer)

def add_customer(request):
    c_name=request.GET.get('cname')
    customer=Customer()
    customer.c_name=c_name
    customer.save()
    return HttpResponse('消费者添加成功 %d' %customer.id)


def add_goods(request):
    g_name=request.GET.get('gname')
    goods=Goods()
    goods.g_name=g_name
    goods.save()
    return HttpResponse('商品添加成功 %d' %goods.id)


def add_to_cart(request):
    # orm的Manytomanyfield 的容错能力非常强, 基本不报错
    customer=Customer.objects.last()
    goods=Goods.objects.last()
    # goods.g_customer.add(customer)   #添加
    # goods.g_customer.remove(customer)   # 删除
    # 或者通过customer添加商品
    customer.goods_set.add(goods)
    return HttpResponse('购物车关系表添加成功')


def get_goods_list(request,customerid):
    customer=Customer.objects.get(pk=customerid)
    # 获取当前customer的商品
    goods=customer.goods_set.all()
    return render(request,'goods_list.html',context=locals())

urls.py

urlpatterns=[
    re_path(r'hello/',views.hello,name='hello'),
    re_path(r'addperson/', views.add_person,name='add_person'),
    re_path(r'addid/',views.add_id,name='add_id'),
    re_path(r'bind/',views.bind,name='bind'),
    re_path(r'deleteperson/',views.delete_person,name='delete_person'),
    re_path(r'deleteidcard/',views.delete_idcard,name='delete_idcard'),
    re_path(r'getperson/',views.get_person,name="get_person"),
    re_path(r'getidcard/',views.get_idcard,name='get_idcard'),
    re_path(r'addcustomer/',views.add_customer,name='add_customer'),
    re_path(r'addgoods/',views.add_goods,name='add_goods'),
    re_path(r'addtocart/',views.add_to_cart,name='add_to_cart'), #添加购物车
    # 查询指定顾客购买的商品列表
    re_path(r'getgoodslist/(?P<customerid>\d+)/',views.get_goods_list,name='get_goods_list'),

    re_path(r'addcat/', views.add_cat,name='add_cat'),
    re_path(r'adddog/', views.add_dog,name='add_dog'),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值