问题描述
我正在使用 Django 和 Restframework 创建 API。
数据是我想要API输出的方式是“MasterResource”模型是Parent,在这种情况下,它过滤“Section”与匹配的“MasterResource”,然后所有相关的“Items”与“Section”匹配。
我的模型目前看起来像这样:
class MasterResource(models.Model):
route_name = models.CharField(max_length=100)
resourceId = models.CharField(primary_key=True,max_length=100)
class ResourceSection(models.Model):
resourceId = models.ForeignKey(MasterResource,on_delete=models.CASCADE,default=1)
resource_name = models.CharField(max_length=100)
sectionId = models.CharField(primary_key=True,max_length=100)
class SectionItem(models.Model):
sectionId = models.ForeignKey(ResourceSection,default=1)
item_title = models.CharField(max_length=100)
image = models.ImageField(blank=True)
link = models.URLField()
我的观点是这样的:
@csrf_exempt
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def create_resource(request):
if request.method == 'POST':
try:
resourceId = request.POST.get("resourceId")
route_name = request.POST.get("route_name")
result = {}
result['resourceDetails'] = json.loads(serializers.serialize('json',[MasterResource.objects.get(resourceId=resourceId)]))
result['sectionDetails'] = json.loads(serializers.serialize('json',ResourceSection.objects.filter(resourceId__resourceId = resourceId)))
result['itemDetails'] = json.loads(serializers.serialize('json',SectionItem.objects.filter(sectionId__sectionId=sectionId)))
return JsonResponse(result,safe=False)
except Exception as e:
return HttpResponseServerError(e)
我已经实现了接收“MasterResource”及其相关“Sections”的数据,但相关“Items”没有输出
电流输出
{
"resourceDetails": [
{
"model": "userdata.masterresource","pk": "1234","fields": {
"route_name": "Testing test"
}
}
],"sectionDetails": [
{
"model": "userdata.resourcesection","pk": "112233","fields": {
"resourceId": 1234,"resource_name": "Test section"
}
},{
"model": "userdata.resourcesection","pk": "223344","resource_name": "Test section2"
}
}
],"itemDetails": []
}
所需的输出如下:
{
"resourceDetails": [
{
"model": "userdata.masterresource","itemDetails": [
{
"model" : "userdata.sectionitem","pk": "1","fields" : {
"sectionId" : 112233
"item_title" : "test"
"image" : "some_image"
"link" : "www.google.com"
}
}
]
}
解决方法
我找到了上述问题的解决方案。
因为我们需要一个部分的所有项目的输出,所以我们需要提供我们需要项目的键或 ID。
这意味着除了 resourceId = request.POST.get("resourceId")
之外,还必须有另一个 POST 数据来提及需要哪些 Item 数据,它位于 resourceId 正下方的 sectionId = request.POST.get("sectionId")
。
因此序列化数据将变为 result['itemDetails'] = json.loads(serializers.serialize('json',SectionItem.objects.filter(sectionId__sectionId=sectionId)))