Извлечение объекта внешнего ключа вместо идентификатора в React из Django API - PullRequest
0 голосов
/ 27 марта 2020

В моем Django API есть модель с внешним ключом для родителя, который ссылается на себя. Я сериализовал данные и вернул их в виде набора. Он возвращает объект, в котором родительское поле показывает родительский идентификатор как int. Тем не менее, я пытаюсь заставить его отображать фактические значения родительского элемента (имя и категория), чтобы затем можно было отобразить соответствующие данные в моем приложении внешнего интерфейса React. Я перечислил мою модель, сериализатор и набор представлений ниже вместе с возвращаемым объектом, который показывает родителя, а также ребенка с родительским идентификатором в родительском поле. Может кто-нибудь помочь, пожалуйста?

class ComponentModel(models.Model):
    name = models.CharField(max_length=50, blank=False)
    wattage = models.PositiveIntegerField(blank=True, null=True)
    category = models.CharField(max_length=13, choices=CATEGORY_CHOICES, blank=False)
    parent = models.ForeignKey(
        'self',
        blank=True,
        null=True,
        on_delete=models.CASCADE
    )

class ComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentModel
        fields = ('id', 'name', 'wattage', 'category', 'parent')

class ComponentViewSet(viewsets.ModelViewSet):
    queryset = ComponentModel.objects.all()
    serializer_class = ComponentSerializer

[
    {
        "id": 1,
        "name": "AMD",
        "wattage": null,
        "category": "cpu",
        "parent": null
    },
    {
        "id": 5,
        "name": "760K",
        "wattage": 100,
        "category": "cpu",
        "parent": 1
    }
]

1 Ответ

1 голос
/ 27 марта 2020

Один из способов - определить более простой сериализатор, а затем использовать его для родителя следующим образом:

class ParentComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentModel
        fields = ('name', 'category')


class ComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentModel
        fields = ('id', 'name', 'wattage', 'category', 'parent')
    parent = ParentComponentSerializer(many=False)

Вы также можете сделать их наследниками через:

class BaseComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentModel
        fields = ['name', 'category']


class ComponentSerializer(serializers.ModelSerializer):
    class Meta(BaseComponentSerializer.Meta):
        fields = BaseComponentSerializer.Meta.fields + ['id', 'wattage', 'parent']
    parent = ParentComponentSerializer(many=False)
...