Django получает данные в сериализаторе из связанной таблицы на расстоянии двух шагов
У меня есть следующие модели:
class Campaign(Base):
name = models.CharField(max_length=100, unique=True)
display_name = models.CharField(max_length=100)
class SubTopic(Base):
name = models.CharField(max_length=100, unique=True)
display_name = models.CharField(max_length=100)
class CampaignSubTopicAssn(Base):
campaign = models.ForeignKey(Campaign, related_name='subtopic_assn', on_delete=models.CASCADE)
subtopic = models.ForeignKey(SubTopic, related_name='campaign_assn',on_delete=models.PROTECT)
class Meta:
unique_together = ('campaign', 'subtopic')
class CampaignSubTopicAssnSerializer(serializers.ModelSerializer):
class Meta:
model = org_models.ContextualCampaignSubTopicAssn
fields = ['subtopic']
В сериализаторе кампании я хочу получить все subtopic_ids
и их display_name
тоже:
В настоящее время этот сериализатор дает только идентификаторы, а не имена, в основном таблица находится в двух шагах от отношения.
class CampaignSerializer(serializers.ModelSerializer):
subtopic_assn = CampaignSubTopicAssnSerializer(many=True)
Вам нужно сериализовать поля Subtopic
и вызвать его в вашем CampaignSubTopicAssnSerializer
, как показано ниже.
class CampaignSubTopicSerializer(serializers.ModelSerializer):
class Meta:
model = SubTopic
fields = ['id', 'name' ]
class CampaignSubTopicAssnSerializer(serializers.ModelSerializer):
subtopic = CampaignSubTopicSerializer()
class Meta:
model = CampaignSubTopicAssn
fields = ['subtopic' ]
Это даст результат, как показано ниже. надеюсь, это то, что вы ожидаете.
или вы можете попробовать следующий код :
class CampaignSubTopicAssnSerializer(serializers.ModelSerializer):
subtopic_id = serializers.IntegerField(source='subtopic.id')
subtopic_name = serializers.StringRelatedField(source='subtopic.name')
class Meta:
model = CampaignSubTopicAssn
fields = ['subtopic_id','subtopic_name' ]
где вы можете изменить subtopic_id
, subtopic_name
в соответствии с вашими требованиями