首页 > 解决方案 > Django rest框架:如何根据特定字段(=不是id)获取外键

问题描述

在下面的代码中,这里TaskAppointment是一个模型,并且有一个字段stateTaskAppointmentState. 使用 Django Rest Framework,我想更新任何TaskAppointment内容并发送state更新。我有这种完美的关系。唯一的问题是 DRF 过滤器TaskAppointmentState基于它的pk(或id)。TaskAppointmentState有两个字段:pkstate(注意它与 中的不一样TaskAppointment)。我想将state发送更新的值更改为TaskAppointmentState基于TaskAppointmentStatestate”字段 = 不是id,但是state

更准确地说,instance.status_id = state.id我不想在下面的代码中做,而是做这个伪代码instance.status_id = "SELECT id FROM TaskAppointmentState WHERE state=request.GET['state']

也许我可以摆脱TaskAppointmentStateSerializer?如果您有任何可行的解决方案...

class TaskAppointmentStateSerializer(BaseSerializer):

    class Meta:
        model = TaskAppointmentState


class TaskAppointmentSerializer(BaseSerializer):

    state = TaskAppointmentStateSerializer(required=False)

    def update(self, instance, validated_data):
        try:
            state = validated_data.pop('state')
            instance.status_id = state.id
        except KeyError:
            pass
        # ... plus any other fields you may want to update
        return instance

    class Meta:
        model = TaskAppointment
        fields = ['id', 'date_start', 'date_end', 'state']
        read_only_fields = ['id', ]

标签: djangodjango-rest-framework

解决方案


是的,您不需要 TaskAppointmentStateSerializer。

您可以使用SlugRelatedField根据相关模型中特定字段的值设置关系:

class TaskAppointmentSerializer(BaseSerializer):
    state = serializers.SlugRelatedField(slug_field='state',
                                         queryset=TaskAppointmentState.objects.all())

推荐阅读