Django REST Framework,序列化程序:其他数据?
Django REST Framework, Serializers: Additional data?
美好的一天,
我想问一下,是否有可能在我的序列化程序中获取额外的数据?
这些是我的模型...
models.py
class Chair(models.Model):
name = models.CharField(max_length=100, null=False, blank=False, unique=True)
bookable = models.BooleanField(default=False)
user_created = models.CharField(max_length=100)
date_created = models.DateField(auto_now_add=True)
class Booking(models.Model):
chair = models.ForeignKey(Chair, on_delete=models.CASCADE)
day = models.DateField()
user_name = models.CharField(max_length=100)
user_created = models.CharField(max_length=100)
date_created = models.DateField(auto_now_add=True)
还有这些我的序列化程序...
serializers.py
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = '__all__'
class ChairSerializer(serializers.ModelSerializer):
class Meta:
model = Chair
fields = '__all__'
像这样在 js 中发出请求时...
views.py
@api_view(['GET'])
def bookings_by_date(request, pk):
bookings = Booking.objects.filter(day=pk)
serializer = BookingSerializer(bookings, many=True)
return Response(serializer.data)
script.js
let url = '...here's my url for Booking...';
fetch(url)
.then((resp) => resp.json())
.then(function(data) {
// do something here
});
...我不仅想获得主席 (models.Foreignkey) 的 ID,还想获得它的名字。我的第一个想法是做这样的事情......
class ChairSerializer(serializers.ModelSerializer):
class Meta:
model = Chair
fields = [
...
'chair',
'chair__name',
...
]
...但这似乎行不通!有谁知道我的问题的解决方案?感谢您的帮助,祝周末愉快!
您可以使用以下两种方式之一:
1-) 使用 SerializerMethodField。您可以通过这种方式添加只读字段。您应该添加 get_<field_name>
方法或为带有名称关键字的字段提供您想要 运行 的方法名称。您可以查看文档以获取更多详细信息。
class BookingSerializer(serializers.ModelSerializer):
chair__name = serializers.SerializerMethodField()
class Meta:
model = Booking
fields = '__all__'
def get_chair_name(self, obj):
return obj.chair.name
2-) 使用具有 source 属性的 CharField:
您基本上可以从哪里定义此字段填充。
class BookingSerializer(serializers.ModelSerializer):
chair__name = serializers.CharField(source='chair__name')
class Meta:
model = Booking
fields = '__all__'
美好的一天,
我想问一下,是否有可能在我的序列化程序中获取额外的数据? 这些是我的模型...
models.py
class Chair(models.Model):
name = models.CharField(max_length=100, null=False, blank=False, unique=True)
bookable = models.BooleanField(default=False)
user_created = models.CharField(max_length=100)
date_created = models.DateField(auto_now_add=True)
class Booking(models.Model):
chair = models.ForeignKey(Chair, on_delete=models.CASCADE)
day = models.DateField()
user_name = models.CharField(max_length=100)
user_created = models.CharField(max_length=100)
date_created = models.DateField(auto_now_add=True)
还有这些我的序列化程序...
serializers.py
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = '__all__'
class ChairSerializer(serializers.ModelSerializer):
class Meta:
model = Chair
fields = '__all__'
像这样在 js 中发出请求时...
views.py
@api_view(['GET'])
def bookings_by_date(request, pk):
bookings = Booking.objects.filter(day=pk)
serializer = BookingSerializer(bookings, many=True)
return Response(serializer.data)
script.js
let url = '...here's my url for Booking...';
fetch(url)
.then((resp) => resp.json())
.then(function(data) {
// do something here
});
...我不仅想获得主席 (models.Foreignkey) 的 ID,还想获得它的名字。我的第一个想法是做这样的事情......
class ChairSerializer(serializers.ModelSerializer):
class Meta:
model = Chair
fields = [
...
'chair',
'chair__name',
...
]
...但这似乎行不通!有谁知道我的问题的解决方案?感谢您的帮助,祝周末愉快!
您可以使用以下两种方式之一:
1-) 使用 SerializerMethodField。您可以通过这种方式添加只读字段。您应该添加 get_<field_name>
方法或为带有名称关键字的字段提供您想要 运行 的方法名称。您可以查看文档以获取更多详细信息。
class BookingSerializer(serializers.ModelSerializer):
chair__name = serializers.SerializerMethodField()
class Meta:
model = Booking
fields = '__all__'
def get_chair_name(self, obj):
return obj.chair.name
2-) 使用具有 source 属性的 CharField: 您基本上可以从哪里定义此字段填充。
class BookingSerializer(serializers.ModelSerializer):
chair__name = serializers.CharField(source='chair__name')
class Meta:
model = Booking
fields = '__all__'