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' ]

Это даст результат, как показано ниже. надеюсь, это то, что вы ожидаете.

enter image description here

или вы можете попробовать следующий код :

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 в соответствии с вашими требованиями

Вернуться на верх