【问题标题】:Django rest framework: how to fetch a foreign key based on a specific field (= not id)Django rest框架:如何根据特定字段(=不是id)获取外键
【发布时间】:2019-10-15 12:33:52
【问题描述】:

这里,在下面的代码中,TaskAppointment 是一个模型,并且有一个字段state,它是TaskAppointmentState 的外键。使用 Django Rest Framework,我想更新任何 TaskAppointment 并发送 state 进行更新。我有这种完美的关系。唯一的问题是 DRF 根据其pk(或id)过滤TaskAppointmentStateTaskAppointmentState 有两个字段:pkstate(注意它与 TaskAppointment 中的字段不同)。我想根据TaskAppointmentStatestate”字段=不是id,而是state,将发送更新的值state更改为TaskAppointmentState

更准确地说,我不想在下面的代码中做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', ]

【问题讨论】:

  • 您的问题不是很清楚,也许您可​​以更详细和详细地说明您的问题。
  • 嗨@rahultyagi 我已经更新了,是不是更容易理解?
  • 当您在 TaskAppointment 模型中为 TaskAppointmentState 创建外键时,您可以使用“to_field”参数提供备用字段/列来制作外键,这样您的第二个序列化程序将始终匹配状态而不是ID。我真的不明白你的问题,但我认为这可能会解决你的问题

标签: django django-rest-framework


【解决方案1】:

是的,您不需要 TaskAppointmentStateSerializer。

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

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

【讨论】:

  • 这行得通!请问您是否知道将查询集更改为动态查询集的解决方案。实际上我需要根据当前状态id找到一个id新的state,类似于“SELECT id FROM app_task_appointment_state WHERE previous_state=[current ta state] AND state = [state in the POST request]
猜你喜欢
  • 2019-02-28
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2016-10-04
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多