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