目前,对于如何最好地引用自定义序列化器验证器方法中的ForeignKey字段实例,我有点概念上的头痛……
对系统进行概述。我有以下"Candidate“模型,这个问题的重要字段是user、job*和status字段。
from model_utils.fields import MonitorField, StatusField
from model_utils import Choices
class Candidate(models.Model):
class Meta:
...
STATUS = Choices(
'matched',
'approached',
'invite_rejected',
'invite_accepted',
'reviewed',
'interview_scheduled',
'hired',
'rejected'
)
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
job = models.ForeignKey('jobs.Job', related_name='candidates', on_delete=models.CASCADE)
...
status = StatusField(default='matched')
...
def save(self, *args, **kwargs):
super(Candidate, self).save(*args, **kwargs)status字段只能根据他们是谁,以及他们试图将状态更新到什么,才能“更新”到给定的值。实际上,我概述的逻辑在序列化程序中如下所示:
from rest_framework import serializers
from .candidates.models import Candidate
class CandidateSerializer(serializers.ModelSerializer):
class Meta:
model = Candidate
fields = '__all__'
def validate_status(self, value):
user = self.context['request'].user
if user.is_anonymous:
raise serializers.ValidationError("The requester must be logged in to make a change to the status field")
# Ensure status value is in valid list of statuses
if value not in [
'matched',
'approached',
'invite_rejected',
'invite_accepted',
'reviewed',
'interview_scheduled',
'hired',
'rejected'
]:
raise serializers.ValidationError("The value provided does not match the prefedined status list")
# Only the candidate owner can update to certain statuses?
if value in [
'invite_rejected',
'invite_accepted',
]:
if not self.user == user:
raise serializers.ValidationError("You don't have the correct permission to update the status")
if value in [
'matched',
'approached',
'reviewed',
'interview_scheduled',
'hired',
'rejected'
]:
if user.is_anonymous or not self.job.organisation.is_admin(user) or not self.job.organisation.is_member(user):
raise serializers.ValidationError("You don't have the correct permission to update the status")
return value也就是说,我可以通过API从序列化程序的user获得Candidate模型的更新或创建的“self.context['request'].user”。
我还在检查这个user最初是匿名的,不是匿名的。
我想要访问的是上述序列化程序的job字段。
我认为序列化程序的"job“属性.可以通过self.job访问。
但是,我认为这将返回Job实例的主键。
因此.我无法访问self.job字段上的self.job属性,因为它在技术上不是Job模型的一个实例:
user = self.context['request'].user
...
if not self.job.organisation.is_admin(user) or not self.job.organisation.is_member(user):
raise serializers.ValidationError("You don't have the correct permission to update the status")因此,我的问题是,我应该如何正确地引用与我正在试图引用的Job Candidate 关联的实例?
*N.B.B.值得注意的是,"job“字段本身引用了"Job”模型,而这个工作模式又有一个组织领域,该字段链接到django-organizations包中概述的组织(参见此处:如果需要,请参阅https://github.com/bennylope/django-organizations/ )。
发布于 2021-03-12 13:13:36
试着做这样的事情:
candidate = Candidate.objects.get(id=instance.pk)
job = Jobs.objects.filter(candidates__pk=candidate.pk)
您需要从查询中检索作业实例,然后可以根据需要使用它。对于更复杂的事情,您可以查看get_serializer_context(self),然后可以将属性作为kwargs传递给序列化程序。很难说得更多而不去看整件事和观点
https://stackoverflow.com/questions/66598047
复制相似问题