django ORM多对多关系使用
一:多对多关系创建
多对多关系创建:分为两种情况,手动创建和django自动创建
1)手动创建:自定义关系表
通过自定义表,通过models.ForeignKey创建关联
class Host(models.Model): nid=models.AutoField(primary_key=True) hostname=models.CharField(max_length=32,db_index=True) ip=models.GenericIPAddressField(protocol='ipv4',db_index=True) port=models.IntegerField() b=models.ForeignKey(to="Business",to_field=("id")) 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")
2)django自动创建关系表:通过models.ManyToManyField创建第三张表
第三张表是不可见的,只能通过关联表访问,比如:Application.r.XX
class Host(models.Model): nid=models.AutoField(primary_key=True) hostname=models.CharField(max_length=32,db_index=True) ip=models.GenericIPAddressField(protocol='ipv4',db_index=True) port=models.IntegerField() b=models.ForeignKey(to="Business",to_field=("id")) class Application(models.Model): name=models.CharField(max_length=32) r=models.ManyToManyField("Host") #多对多
两种方式都使用,当关系需要增加其他列的时候,第一种方式(可定制)。方式二,只有两个关联表的ID,没有其他字段,如果需要补充其他字段,使用方式1
二:多对多关系数据操作
方式1:HostToApp.objects.create(hobj_id=1,aobj_id=1)
方式2:无法直接对第三张表进行操作
先创建关系对象,通过对象访问等
第三张表操作 #增加 obj.r.add(1)表示在第三张表里增加了一个1 obj.r.add(2) obj.r.add(2,3,4) obj.r.add(*[1,2,3]) #列表数据需要在前面加*号 #删除 obj.r.remove(1) obj.r.remove(2,3) obj.r.remove(*[1,2,3]) #清空对应关系为1的所有数据 obj.r.clear() #obj.set([3,5,6]) 如果这样设置,数据库里只有3,5,6,其他都被删除
obj.set([3,5,6])
#obj.r.all() 所有相关主机对象queryset
obj.r.all() #页面要循环访问数据
示例
def app(request): app_list=Application.objects.all() for app_tmp in app_list: print(app_tmp.name,app_tmp.r.all()) return render(request,"app.html") -------------------------- CDA <QuerySet [<Host: Host object>, <Host: Host object>]> DBA <QuerySet [<Host: Host object>]> def app(request): app_list=Application.objects.all() # for app_tmp in app_list: # print(app_tmp.name,app_tmp.r.all()) return render(request,"app.html",{"app_list":app_list}) <table border="1px"> <thead> <tr> <td>应用名称</td> <td>应用主机列表</td> </tr> </thead> <tbody> {% for app in app_list %} <tr> <td>{{ app.name }}</td> <td>{% for r in app.r.all%} <~-- 循环访问第三张表里数据--> <span>{{ r.hostname }}</span> {% endfor %} </td> </tr> {% endfor %} </tbody> </table>