django - 使用 OneToOneField 序列化对象
问题描述
我正在尝试将带有上下文字典的 Scenes 对象发送到模板。这些是模型:
class Scene1(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
number = models.IntegerField(default=0)
name = models.CharField(max_length=20)
class Scene2(models.Model):
timestamp = models.DateTimeField(auto_now_add=True)
number = models.IntegerField(default=0)
name = models.CharField(max_length=20)
class Scenes(models.Model):
scene1 = models.OneToOneField(Scene1, on_delete=models.CASCADE)
scene2 = models.OneToOneField(Scene2, on_delete=models.CASCADE)
当我做
queryset = Scenes.objects.filter(id=1).values()
context = {"scenes": queryset[0]}
print(queryset)
我得到:
<QuerySet [{'id': 1, 'scene1_id': 3, 'scene2_id': 3,}]>
如何序列化数据以使 Scene1 和 Scene2 中的所有信息在上下文字典中可见?
解决方案
我最终使用了这些序列化程序:
from rest_framework import serializers
class Scene1Serializer(serializers.ModelSerializer):
class Meta:
model = Scene1
fields = ('name',)
class Scene2Serializer(serializers.ModelSerializer):
class Meta:
model = Scene2
fields = ('name',)
class ScenesDetailSerializer(serializers.ModelSerializer):
scene1 = Scene1Serializer()
scene2 = Scene2Serializer()
class Meta:
model = Scenes
fields = ('scene1', 'scene2')
那么在我看来:
queryset = Scenes.objects.filter(id=1)
scenes = queryset[0]
scenes_serialized = ScenesDetailSerializer(scenes)
data = scenes_serialized.data
print(data) # prints: {'scene1': OrderedDict([('name', some_name_1)]), 'scene2': OrderedDict([('name', some_name_2)])
context = {"scenes": data}
现在在模板中我可以使用点符号来获取名称变量:
{{ scenes.scene1.name }}
{{ scenes.scene2.name }}
推荐阅读
- javascript - 引导按钮在移动 chrome 上不起作用
- javascript - 这里使用了什么 Javascript 功能?
- sql - 一般错误:1364 字段“标题”没有默认值
- android - 如何为 Firebase 身份验证用户设置自定义用户 UID?
- azure - Azure API 管理 - 自定义域特定 API?
- python - 有没有办法强制 matplotlib OO 接口?
- python - Discord Python 重写 - 切片显示名称
- html - 图像在网格中未正确显示
- r - 我想在同一个 ggplot 中绘制多个值
- java - 在 JAXB 中解组期间忽略未定义的元素引用