Django rest framework: как получить внешний ключ на основе определенного поля (= не id) - PullRequest
0 голосов
/ 15 октября 2019

Здесь, в следующем коде, TaskAppointment является моделью и имеет поле state, которое является внешним ключом для TaskAppointmentState. Используя Django Rest Framework, я хотел бы обновить любую TaskAppointment и отправить state для обновления. У меня есть это отношение, которое прекрасно работает. Единственная проблема заключается в том, что фильтры DRF TaskAppointmentState основаны на его pk (или id). TaskAppointmentState имеет два поля: pk и state (будьте осторожны, это не то же самое, что в TaskAppointment). Я хотел бы изменить значение state, которое отправляется для обновления, на TaskAppointmentState на основе поля TaskAppointmentState "state" = не 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', ]

1 Ответ

0 голосов
/ 15 октября 2019

Да, вам не нужен TaskAppointmentStateSerializer.

Вы можете использовать SlugRelatedField , чтобы установить отношение на основе значения конкретного поля в связанной модели:

class TaskAppointmentSerializer(BaseSerializer):
    state = serializers.SlugRelatedField(slug_field='state',
                                         queryset=TaskAppointmentState.objects.all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...