django - Django rest框架:如何根据特定字段(=不是id)获取外键
问题描述
在下面的代码中,这里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', ]
解决方案
是的,您不需要 TaskAppointmentStateSerializer。
您可以使用SlugRelatedField根据相关模型中特定字段的值设置关系:
class TaskAppointmentSerializer(BaseSerializer):
state = serializers.SlugRelatedField(slug_field='state',
queryset=TaskAppointmentState.objects.all())
推荐阅读
- ios - CLLocation2D 没有从变量中获得赋值
- c# - 如何找出正在运行的 Discord 机器人实例的数量?
- spring-boot - spring boot + cassandra 轻量级事务更新
- kotlin - println() 产生不同的输出
- r - 删除相同的列,同时从每个组中保留一个
- python - 我应该如何拆分 LSF 字符串?
- fortran - OpenMP 4.0 标准是否支持现代 Fortran 中的类型绑定过程?
- android - 何时将应用程序数据保存在内存中?
- sql - 从 2 个表中填充 Listview
- javascript - javascript中的构造函数和API接口有何不同?