使用模型字段一起获取 Django 模型中的多对多字段
Get Many to many fileds in django model with together model fields
我有两个模型;
class userPageAuths(models.Model):
enName = models.CharField(max_length=30)
trName = models.CharField(max_length=30)
def __str__(self):
return self.enName
class userPages(models.Model):
enName = models.CharField(max_length=30)
trName = models.CharField(max_length=30)
parent_id = models.IntegerField(blank=True, null=True)
user_page_auths = models.ManyToManyField(userPageAuths, related_name="page_auth_list", blank=True)
def __str__(self):
return self.enName
第一个模型数据在我的数据库中;
第二个模型数据是;
此数据适用于多对多字段;
我想得到这样的所有数据;
[
{
"id": 1,
"enName": "x",
"trName": "x",
"parent_id": null
},
{
"id": 2,
"enName": "y",
"trName": "y",
"parent_id": null
},
{
"id": 3,
"enName": "z",
"trName": "z",
"parent_id": 2
},
{
"id": 1,
"enName": "a",
"trName": "a",
"parent_id": 3 // this userpages_id which connected manytomany relation and ı want to get this as a parent_id
},
{
"id": 2,
"enName": "b",
"trName": "b",
"parent_id": 3
},
{
"id": 3,
"enName": "c",
"trName": "c",
"parent_id": 3
},
]
我用这个序列化器;
class pagesSerializer(serializers.ModelSerializer):
class Meta:
model = userPages
fields = ('id', 'enName', 'trName', 'parent_id')
这是我的方法;
class pagesListView(ListAPIView):
serializer_class = pagesSerializer
def get_queryset(self):
return list(itertools.chain(userPages.objects.all(), userPageAuths.objects.all()))
我得到了这样的数据;
[
{
"id": 1,
"enName": "x",
"trName": "x",
"parent_id": null
},
{
"id": 2,
"enName": "y",
"trName": "y",
"parent_id": null
},
{
"id": 3,
"enName": "z",
"trName": "z",
"parent_id": 2
},
{
"id": 1,
"enName": "a",
"trName": "a",
"parent_id": null
},
{
"id": 2,
"enName": "b",
"trName": "b",
"parent_id": null
},
{
"id": 3,
"enName": "c",
"trName": "c",
"parent_id": null
},
]
我想得到 userpages_id 作为 a,b,c 名字的 parent_id。这可能还是其他解决方案?
class pagesListView(ListAPIView):
serializer_class = pagesSerializer
def get_queryset(self):
all = list(itertools.chain(userPages.objects.all()))
serializer = pagesSerializer(all, many=True)
json_data = json.loads(json.dumps(serializer.data))
for element in json_data:
if 'user_page_auths' in element:
if element['user_page_auths']:
for data in element['user_page_auths']:
data["parent_id"] = element['id']
json_data.append(data)
del element['user_page_auths']
else:
del element['user_page_auths']
return json_data
我使用上面的解析数据解决了我的问题。
我有两个模型;
class userPageAuths(models.Model):
enName = models.CharField(max_length=30)
trName = models.CharField(max_length=30)
def __str__(self):
return self.enName
class userPages(models.Model):
enName = models.CharField(max_length=30)
trName = models.CharField(max_length=30)
parent_id = models.IntegerField(blank=True, null=True)
user_page_auths = models.ManyToManyField(userPageAuths, related_name="page_auth_list", blank=True)
def __str__(self):
return self.enName
第一个模型数据在我的数据库中;
第二个模型数据是;
此数据适用于多对多字段;
我想得到这样的所有数据;
[
{
"id": 1,
"enName": "x",
"trName": "x",
"parent_id": null
},
{
"id": 2,
"enName": "y",
"trName": "y",
"parent_id": null
},
{
"id": 3,
"enName": "z",
"trName": "z",
"parent_id": 2
},
{
"id": 1,
"enName": "a",
"trName": "a",
"parent_id": 3 // this userpages_id which connected manytomany relation and ı want to get this as a parent_id
},
{
"id": 2,
"enName": "b",
"trName": "b",
"parent_id": 3
},
{
"id": 3,
"enName": "c",
"trName": "c",
"parent_id": 3
},
]
我用这个序列化器;
class pagesSerializer(serializers.ModelSerializer):
class Meta:
model = userPages
fields = ('id', 'enName', 'trName', 'parent_id')
这是我的方法;
class pagesListView(ListAPIView):
serializer_class = pagesSerializer
def get_queryset(self):
return list(itertools.chain(userPages.objects.all(), userPageAuths.objects.all()))
我得到了这样的数据;
[
{
"id": 1,
"enName": "x",
"trName": "x",
"parent_id": null
},
{
"id": 2,
"enName": "y",
"trName": "y",
"parent_id": null
},
{
"id": 3,
"enName": "z",
"trName": "z",
"parent_id": 2
},
{
"id": 1,
"enName": "a",
"trName": "a",
"parent_id": null
},
{
"id": 2,
"enName": "b",
"trName": "b",
"parent_id": null
},
{
"id": 3,
"enName": "c",
"trName": "c",
"parent_id": null
},
]
我想得到 userpages_id 作为 a,b,c 名字的 parent_id。这可能还是其他解决方案?
class pagesListView(ListAPIView):
serializer_class = pagesSerializer
def get_queryset(self):
all = list(itertools.chain(userPages.objects.all()))
serializer = pagesSerializer(all, many=True)
json_data = json.loads(json.dumps(serializer.data))
for element in json_data:
if 'user_page_auths' in element:
if element['user_page_auths']:
for data in element['user_page_auths']:
data["parent_id"] = element['id']
json_data.append(data)
del element['user_page_auths']
else:
del element['user_page_auths']
return json_data
我使用上面的解析数据解决了我的问题。