首页 > 解决方案 > Rest框架的外键关系——Django

问题描述

我正在使用 Django 和 Restframework 创建 API。

数据是我希望 API 输出以这样一种方式,即“MasterResource”模型是父级,在它过滤“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, on_delete=models.CASCADE,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",
            "fields": {
                "resourceId": 1234,
                "resource_name": "Test section2"
            }
        }
    ],
    "itemDetails": []
}

所需的输出是这样的:


{
    "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",
            "fields": {
                "resourceId": 1234,
                "resource_name": "Test section2"
            }
        }
    ],
    "itemDetails": [
    {
      "model" : "userdata.sectionitem",
      "pk": "1",
      "fields" : {
        "sectionId" : 112233
        "item_title" : "test"
        "image" : "some_image"
        "link" : "www.google.com"
      }
    }
    ]
}

标签: python-3.xdjangoforeign-keys

解决方案


我找到了上述问题的解决方案。

因为我们需要一个部分的所有项目的输出,所以我们需要提供一个我们需要项目的键或 ID。

resourceId = request.POST.get("resourceId")这意味着必须有另一个 POST 数据来提及需要哪些 Item 数据,而不是 only ,sectionId = request.POST.get("sectionId")它就在 resourceId 的下方。

因此它将成为序列化数据result['itemDetails'] = json.loads(serializers.serialize('json',SectionItem.objects.filter(sectionId__sectionId=sectionId)))


推荐阅读