微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rest框架的外键关系——Django

如何解决Rest框架的外键关系——Django

我正在使用 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)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。