这里以一个实例来说明:
多对多关系表的建立
首先可以先建立一个model:
这里有两个类:角色People与绰号Nickname。一个人可以有多个绰号,同理,一个绰号有可能被多个人共用。因此他们是多对多的关系。
这里我们在Nickname中声明ManyToManyField。(改成People中声明也可以)
class People(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField()
class Nickname(models.Model):
title = models.CharField(max_length=50)
people = models.ManyToManyField(People)
这样便会生成三个表:角色表,绰号表,角色_绰号关联表。
数据的查询
这里通过model有无ManyToManyField的两种情况分别进行查询,(修改与添加等类似):
People表:
用于model中没有ManyToManyField,因此需要类似反向查询的:表名(小写的)_set 的方法进行关联。
class PeopleView(View):
def get(self,request):
temp = People.objects.all()
aimlist = []
for i in temp:
aimlist.append({
"name":i.name,
"age": i.age,
"nickname":list(i.nickname_set.all().values())
})
return JsonResponse({"aimlist":aimlist})
Nickname表:
用于model中存在ManyToManyField:
class NicknameView(View):
def get(self,request):
temp = Nickname.objects.all()
aimlist = []
for i in temp:
aimlist.append({
"title":i.title,
"nickname":list(i.people.all().values())
})
return JsonResponse({"aimlist":aimlist})
数据的添加
多对多的属性通常为列表形式的数据,里面存放的是id,如 [1,2,3],
可以通过对其进行循环遍历的方法逐一通过add()方法进行添加。
def post(self,request):
data = json.loads(request.body)
newpeople = People.objects.create(name=data['name'],age=data['age'])
for i in data['nickname']: #传递的是存放id的数组,如[1,2,3]
newpeople.nickname_set.add(i)
#newpeople.people.add(i)
return JsonResponse({"code": 200})
数据的修改
先通过id找到要修改的数据,对其其他属性进行修改;
然后再将关联表中与本次修改的数据关联的所有字段删除,再逐一遍历添加即可。
def put(self,request):
data = json.loads(request.body)
aimpeople = People.objects.get(id=data["id"])
aimpeople.name = data['name']
aimpeople.age = data['age']
aimpeople.nickname_set.clear() #先清空关联表中的相关数据,再遍历列表重新添加。
for i in data['nickname']:
aimpeople.nickname_set.add(i)
aimpeople.save()
return JsonResponse({"code": 200})
数据的删除
这个很简单,正常删就好,关联表会自动变化。
def delete(self,request):
aimid = request.GET.get("id")
aimpeople = People.objects.get(id=aimid)
aimpeople.delete()
return JsonResponse({"code": 200})
以上就是django中多对多表相关操作的全部内容了,希望对你有所帮助^_^