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
我想问一下,是否可以使用第二个模型的相关数据创建响应?例如:
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