Django 序列化器,如何在嵌套桥模型序列化器中显示数据

问题描述 投票:0回答:1

我正在使用

Django REST Framework

我有 3 个不同的模型,其中 2 个是独立模型,而第 3 个是连接前 2 个模型的

bridge model

# First standalone model class Build(TimeStampedModel): name = models.CharField(max_length=64, null=False, blank=False) type = models.CharField(max_length=64, null=False, blank=False) play_as = models.CharField(max_length=64, null=False, blank=False) link = models.CharField(max_length=255, null=False, blank=False) class Meta: ordering = ['-created_at'] def __str__(self): return f'{self.play_as} - {self.name}' # Second standalone model class Run(TimeStampedModel): name = models.CharField(max_length=64, null=False, blank=False) difficulty = models.CharField(max_length=64, null=False, blank=False) origin = models.CharField(max_length=64, null=False, blank=False) alignment = models.CharField(max_length=64, null=False, blank=False) class Meta: ordering = ['-created_at'] def __str__(self): return f'{self.name} - {self.difficulty}' # Bridge model class RunBuild(TimeStampedModel): run = models.ForeignKey( Run, related_name='runBuild_run', on_delete=models.CASCADE, null=False, blank=False ) build = models.ForeignKey( Build, related_name='runBuild_builds', on_delete=models.CASCADE, null=False, blank=False ) class Meta: ordering = ['-run'] def __str__(self): return f'{self.run.name} - {self.build.name}'

Build

序列化器没问题,问题在于
RunBuild
Run
序列化器。

# Model Serializer for Build model class BuildSerializer(serializers.ModelSerializer): created_at = serializers.SerializerMethodField() class Meta: model = Build exclude = ['updated_at'] def get_created_at(self, instance): return instance.created_at.strftime('%B %d, %Y') # Model Serializer for RunBuild model class RunBuildSerializer(serializers.ModelSerializer): # This doesn't work runBuild_builds = BuildSerializer(many=True, read_only=True) created_at = serializers.SerializerMethodField() class Meta: model = RunBuild fields = ['run', 'build', 'created_at', 'runBuild_builds'] def get_created_at(self, instance): return instance.created_at.strftime('%B %d, %Y') # Model Serializer for Run model class RunSerializer(serializers.ModelSerializer): # This works runBuild_run = RunBuildSerializer(many=True, read_only=True) created_at = serializers.SerializerMethodField() class Meta: model = Run fields = [ 'name', 'difficulty', 'origin', 'alignment', 'created_at', 'runBuild_run' ] def get_created_at(self, instance): # We will format the date return instance.created_at.strftime('%B %d, %Y')
A 

Run

 由几个字段和其下的许多 
Builds
 组成,这就是为什么我需要一个桥梁模型。我可以在 
RunBuild
 序列化器中显示许多 
Run
,就像这样

{ "name": "Versatile Bard", "difficulty": "Tactician", "origin": "The Dark Urge", "alignment": "Chaotic Neutral", "created_at": "March 14, 2024", "runBuild_run": [ { "run": 1, "build": 1, "created_at": "March 14, 2024" }, { "run": 1, "build": 2, "created_at": "March 14, 2024" }, .... ] }
但是如果我对 

RunBuild

 序列化器做同样的事情,它不会显示任何东西(我希望它显示每个 
Build

{ "run": 1, "build": 1, "created_at": "March 14, 2024" "runBuild_builds": [ { "name": "Cleric / Bard - CC / Versatile Spellcaster", "type": "Main Character", "play_as": "Main Character", "link": "......." }, .... ] }
答案中不存在 

runBuild_builds

 字段,我现在手动添加以向您展示它应该如何。

最终的结果应该是,在

Run

序列化器中,有这样的结果

{ "name": "Versatile Bard", "difficulty": "Tactician", "origin": "The Dark Urge", "alignment": "Chaotic Neutral", "created_at": "March 14, 2024", "runBuild_run": [ { "run": 1, "build": 1, "created_at": "March 14, 2024", "runBuild_builds": [ { "name": "Cleric / Bard - CC / Versatile Spellcaster", "type": "Main Character", "play_as": "Main Character", "link": "......." }, .... ] }, .... ] }
关于如何修改我的代码有什么想法吗?

django django-models django-rest-framework django-serializer
1个回答
0
投票
像这样更新你的

RunBuildSerializer

class RunBuildSerializer(serializers.ModelSerializer): # This doesn't work build = BuildSerializer(many=True, read_only=True) created_at = serializers.SerializerMethodField() class Meta: model = RunBuild fields = ['run', 'build', 'created_at'] def get_created_at(self, instance): return instance.created_at.strftime('%B %d, %Y')
从此序列化器中删除 

runBuild_builds

 字段。因为这是 related_name 字段,当我们需要从 
RunBuild
 类访问 
Build
 类时需要使用它。

© www.soinside.com 2019 - 2024. All rights reserved.