首页 > 解决方案 > 使用 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 中的所有信息在上下文字典中可见?

标签: djangopython-3.x

解决方案


我最终使用了这些序列化程序:

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 }}

推荐阅读