一对一,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'),
]