DjangoRestFramework & Javascript:获取额外数据

DjangoRestFramework & Javascript: Fetch additional data

我想问一下,是否可以使用第二个模型的相关数据创建响应?例如:

models.py

class Manufacturer(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False, unique=True)
    date_created = models.DateTimeField(auto_now_add=True)

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, null=False, blank=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, null=False, blank=False)
    date_created = models.DateTimeField(auto_now_add=True)

serializers.py

class ManufacturerSerializer(ModelSerializer):
    class Meta:
        model = Manufacturer
        exclude = [
            'date_created',
        ]

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
        exclude = [
            'date_created',
        ]

views.py

@api_view(['GET'])
def api_list_manufacturer(request):
    qs = Manufacturer.objects.all()
    serializer = ManufacturerSerializer(qs, many=True)
    return Response(serializer.data)

@api_view(['GET'])
def api_list_card(request):
    qs = Car.objects.all()
    serializer = CarSerializer(qs, many=True)
    return Response(serializer.data)

我知道我正在使用获取方法来接收 Car...

的数据
fetch(url)
.then(response => response.json)
.then(function(data) {
    console.log(data);
});

...数据如下所示:

0: {id: 1, name: 'Focus', manufacturer: 1},
1: {id: 2, name: 'F-150', manufacturer: 1},
2: {id: 3, name: 'Model S', manufacturer: 2}

我的问题:

是否可以将 制造商名称 加入我的回复中?是这样的吗?

0: {id: 1, name: 'Focus', manufacturer: 1, manufacturer__name: 'Ford'},
1: {id: 2, name: 'F-150', manufacturer: 1, manufacturer__name: 'Ford'},
2: {id: 3, name: 'Model S', manufacturer: 2, manufacturer__name: 'Tesla'}

感谢您的帮助,祝您周日愉快!

好的,

所以我找到了解决方案!在我的 serializers.py 中,我将 car 的那个改成了这个:

class CarSerializer(ModelSerializer):
    manufacturer_name = CharField(source='manufacturer.name')

    class Meta:
        model = Car
        exclude = [
            'date_created',
        ]

使用SerializerMethodField。这是一个只读字段。它通过在它所附加的序列化器 class 上调用一个方法来获取它的值。它可用于将任何类型的数据添加到对象的序列化表示中

在 serializers.py 内添加:

from rest_framework.serializers import SerializerMethodField

class CarSerializer(ModelSerializer):
    manufacturer__name = SerializerMethodField(help_text="Name of the Car Manufacturer")

    class Meta:
        model = Car
        fields = [
            'id',
            'name',
            'manufacturer',
            'manufacturer__name',
        ]

    def get_manufacturer__name(self, instance: Car):
        return instance.manufacturer.name