创建并操作多对多表

- 根据queryset对象增删改查(自己不创建第三张关系表,有m2m字段: 根据queryset对象增删改查(推荐))
from django.contrib import admin
from app01 import models
class StudentAdmin(admin.ModelAdmin):
list_display = ('id','name','age',)
search_fields = ('name','age',)
class ClassNameAdmin(admin.ModelAdmin):
list_display = ('clsname',)
search_fields = ('clsname',)
class LessonAdmin(admin.ModelAdmin):
list_display = ('name',)
search_fields = ('name',)
admin.site.register(models.Student, StudentAdmin)
admin.site.register(models.ClassName, ClassNameAdmin)
admin.site.register(models.Lesson, LessonAdmin)
- 第二种: 自己创建第三张关系表,无 m2m 字段,自己链表查询
from django.db import models
#表1:主机表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
#表2:应用表
class Application(models.Model):
name = models.CharField(max_length=32)
#表3:自定义第三张关联表
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)
- 第三种: 自己不创建第三张关系表,有m2m字段: 根据数字id增删改查
from django.shortcuts import HttpResponse
from app01 import models
def orm(request):
# 使用间接方法对第三张表操作
obj = models.Group.objects.get(id=1)
# 1、添加
obj.m2m.add(1) # 在第三张表中增加一个条目(1,1)
obj.m2m.add(2, 3) # 在第三张表中增加条目(1,2)(1,3)两条关系
obj.m2m.add(*[1,3]) # 在第三张表中增加条目(1,2)(1,3)两条关系
# 2、删除
obj.m2m.remove(1) # 删除第三张表中的(1,1)条目
obj.m2m.remove(2, 3) # 删除第三张表中的(1,2)(1,3)条目
obj.m2m.remove(*[1, 2, 3]) # 删除第三张表中的(1,1)(1,2)(1,3)条目
# 3、清空
obj.m2m.clear() # 删除第三张表中application条目等于1的所有条目
# 4 更新
obj.m2m.set([1, 2,]) # 第三张表中会删除所有条目,然后创建(1,1)(1,2)条目
# 5 查找
print( obj.m2m.all() ) # 等价于 models.UserInfo.objects.all()
# 6 反向查找: 双下划线
hosts = models.Group.objects.filter(m2m__id=1) # 在Host表中id=1的主机同时属于那些组
# 自动创建Host表和Group表中的数据
'''
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')