【发布时间】:2020-08-03 10:05:16
【问题描述】:
我有一个模型,它有一个类,它由许多其他使用 OneToOneField 的类组成。 我的最终目标是能够以抽象的方式(不使用字段名称)循环数据结构并使用模板标签将内容输出到我的模板。我想为我的模板提供嵌套json 格式的数据,并直接在我的模板中使用模板标签解析 json。我已经使用了 Django rest 框架。以下是我的代码库的通用示例:
models.py--------------------------------------
from django.db import models
from rest_framework import serializers
class Class1(models.Model):
class_1_field_1 = models.CharField()
class_1_field_2 = models.CharField()
class Class2(models.Model):
class_2_field_1 = models.CharField()
class_2_field_2 = models.CharField()
class MainClass(models.Model):
field_1 = models.CharField()
field_2 = models.IntegerField()
field_3 = models.DateTimeField()
class_1 = models.OneToOneField(Class1, on_delete=models.CASCADE,)
class_2 = models.OneToOneField(Class2, on_delete=models.CASCADE,)
class Class1Serializer(serializers.ModelSerializer):
class Meta:
model = Class1
fields = ('class_1_field_1', 'class_1_field_2')
class Class2Serializer(serializers.ModelSerializer):
class Meta:
model = Class2
fields = ('class_2_field_1', 'class_2_field_2')
class MainClassSerializer(serializers.ModelSerializer):
class_1= Class1Serializer()
class_2= Class2Serializer()
class Meta:
model = MainClass
fields = ('field1', 'field2', 'field3', 'class_1', 'class_2')
views.py-------------------------------------
from django.views.generic import ListView
from rest_framework.renderers import JSONRenderer
from MyApp.models import MainClass, MainClassSerializer
MainClassListView(ListView):
context_object_name = 'mainclasses'
model = MainClass
serializer_class = MainClassSerializer
def get_queryset(self):
object_list = MainClass.objects.filter(user__in=[self.request.user])
return object_list
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
serializer = MainClassSerializer(MainClass.objects.filter(user__in=[self.request.user]), many=True)
context['data'] = JSONRenderer().render(serializer.data)
return context
def dispatch(self, request, *args, **kwargs):
return super(MainClassListView, self).dispatch(request, *args, **kwargs)
index.html----------------------------------------------------
...
{{data}}
...
json output-------------------------------------------------------
b'[{
"field_1": "Some String",
"field_2": 100,
"field_3": "2020-04-20T02:34:27.912451Z",
"class_1": {
"class_1_field_1": "str_1",
"class_1_field_2": "str_2"
},
"class_2": {
"class_2_field_1": "str_3",
"class_2_field_2": "str_4"
}
}]'
{{data}} 标记显示具有以下格式的字符串(见上文):b'[valid_json_is_displayed_here]',其中valid_json_is_displayed_here 是格式正确的 json 结构,其中包括来自 OneToOneField 关系的嵌套数据。
我想直接在我的模板中解析模板标签中返回的 json 输出中的各个值,包括一对一的关系数据。这在 Django 中是否可行,我该如何实现?我觉得它应该很简单,我错过了什么?
谢谢。
【问题讨论】:
-
或者,您可以简单地将
MainClass实例传递给模板,并在模板中访问mainClassInstance.class_1.class_1_field1等字段。更简单、更干净的代码。
标签: django django-models django-rest-framework django-templates