python-3.x - 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"
}
}
]
}
解决方案
我找到了上述问题的解决方案。
因为我们需要一个部分的所有项目的输出,所以我们需要提供一个我们需要项目的键或 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)))
推荐阅读
- c++ - CUDA C++ 重叠 SERIAL 内核执行和数据传输
- hibernate - 如何使用hibernate jpa本机查询检索具有子实体集合的父实体?
- mysql - 如何使用 MYSQL 计算另外两个表中的条目数?
- linux - 如何将在 AWS Linux 上运行的 C websocket 服务器与本地虚拟机上的客户端链接?
- c++ - 为什么要引入 std::ranges::less ?
- python - 带有 Postgres 的 Django 项目在 brew install 后停止工作
- python - 如何使用 matplotlib 中的子图控制紧凑图形的确切大小?
- package-managers - 如果软件自行更新并且尝试再次通过 choco 更新,chocolatey 有什么副作用吗?
- python - 测试 Python-socketio Emit
- python - 查找一列中的单词与其他列中的句子之间的“匹配”