01.不创建第三张表 推荐(法1)
- 第一种: 自己不创建第三张关系表,有m2m字段: 根据queryset对象增删改查(推荐)
1.1 创建表
from django.db import models
class UserInfo(models.Model):
username = models.CharField(max_length=32)
def __str__(self):
return self.username
class UserGroup(models.Model):
group_name = models.CharField(max_length=64)
user_info = models.ManyToManyField(to='UserInfo',related_query_name='m2m')
def __str__(self):
return self.group_name
1.2 根据queryset对象操作
from django.shortcuts import HttpResponse
from app01 import models
def orm(request):
user_info_obj = models.UserInfo.objects.get(username='zhangsan')
user_info_objs = models.UserInfo.objects.all()
group_obj = models.UserGroup.objects.get(group_name='group_python')
group_objs = models.UserGroup.objects.all()
group_obj.user_info.add(user_info_obj)
group_obj.user_info.add(*user_info_objs)
group_obj.user_info.remove(user_info_obj)
group_obj.user_info.remove(*user_info_objs)
user_info_obj.usergroup_set.add(group_obj)
user_info_obj.usergroup_set.add(*group_objs)
user_info_obj.usergroup_set.remove(group_obj)
user_info_obj.usergroup_set.remove(*group_objs)
print(group_obj.user_info.all())
print(group_obj.user_info.all().filter(username='zhangsan'))
print(user_info_obj.usergroup_set.all())
print(user_info_obj.usergroup_set.all().filter(group_name='group_python'))
print( models.UserGroup.objects.filter(user_info__username='zhangsan'))
print( models.UserInfo.objects.filter(m2m__group_name='group_python'))
'''
user_list = [{'username':'zhangsan'},
{'username':'lisi'},
{'username':'wangwu'},]
group_list = [{'group_name':'group_python'},
{'group_name':'group_linux'},
{'group_name':'group_mysql'},]
for c in user_list:
models.UserInfo.objects.create(**c)
for l in group_list:
models.UserGroup.objects.create(**l)
'''
return HttpResponse('orm')
02.自己创建第三张关系表(法2)
- 第二种: 自己创建第三张关系表,无 m2m 字段,自己链表查询
from django.db import models
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
class Application(models.Model):
name = models.CharField(max_length=32)
class HostToApp(models.Model):
hobj = models.ForeignKey(to="Host",to_field="nid")
aobj = models.ForeignKey(to='Application',to_field='id')
HostToApp.objects.create(hobj_id=1,aobj_id=2)
03.根据外检ID操作(法3)
- 第三种: 自己不创建第三张关系表,有m2m字段: 根据数字id增删改查
3.1 创建表
from django.db import models
class Host(models.Model):
hostname = models.CharField(max_length=32,db_index=True)
class Group(models.Model):
group_name = models.CharField(max_length=32)
m2m = models.ManyToManyField("Host")
3.2 根据id增删改查
from django.shortcuts import HttpResponse
from app01 import models
def orm(request):
obj = models.Group.objects.get(id=1)
obj.m2m.add(1)
obj.m2m.add(2, 3)
obj.m2m.add(*[1,3])
obj.m2m.remove(1)
obj.m2m.remove(2, 3)
obj.m2m.remove(*[1, 2, 3])
obj.m2m.clear()
obj.m2m.set([1, 2,])
print( obj.m2m.all() )
hosts = models.Group.objects.filter(m2m__id=1)
'''
hostname = [{'hostname':'zhangsan'},
{'hostname':'lisi'},
{'hostname':'wangwu'},]
group_name = [{'group_name':'DBA'},{'group_name':'public'},]
for h in hostname:
models.Host.objects.create(**h)
for u in group_name:
models.Group.objects.create(**u)
'''
return HttpResponse('orm')
04.ManyToManyField参数
- 创建m2m多对多时ManyToManyField可以添加的参数
1、to,
2、related_name=None,
3、related_query_name=None,
4、limit_choices_to=None,
5、symmetrical=None,
6、through=None,
7、through_fields=None,
8、db_constraint=True,
db_table=None,
05.values和values_list
from django.shortcuts import HttpResponse
from app01 import models
def orm(request):
models.UserGroup.objects.filter(group_name='group_python').values('group_name', 'user_info__username')
models.UserInfo.objects.filter(username='zhangsan').values('username', 'm2m__group_name')
models.UserGroup.objects.filter(group_name='group_python').values_list('group_name', 'user_info__username')
lesson = models.UserInfo.objects.filter(username='zhangsan').values_list('username', 'm2m__group_name')
'''
# user_info_obj = models.UserInfo.objects.get(username='lisi')
# user_info_objs = models.UserInfo.objects.all()
#
# group_obj = models.UserGroup.objects.get(group_name='group_python')
# group_objs = models.UserGroup.objects.all()
#
# group_obj.user_info.add(*user_info_objs)
# user_info_obj.usergroup_set.add(*group_objs)
user_list = [{'username':'zhangsan'},
{'username':'lisi'},
{'username':'wangwu'},]
group_list = [{'group_name':'group_python'},
{'group_name':'group_linux'},
{'group_name':'group_mysql'},]
for c in user_list:
models.UserInfo.objects.create(**c)
for l in group_list:
models.UserGroup.objects.create(**l)
'''
return HttpResponse('orm')