首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django DRF -访问自定义序列化验证器方法中的字段ForeignKey实例。

Django DRF -访问自定义序列化验证器方法中的字段ForeignKey实例。
EN

Stack Overflow用户
提问于 2021-03-12 10:18:33
回答 1查看 70关注 0票数 0

目前,对于如何最好地引用自定义序列化器验证器方法中的ForeignKey字段实例,我有点概念上的头痛……

对系统进行概述。我有以下"Candidate“模型,这个问题的重要字段是userjob*和status字段。

代码语言:javascript
复制
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字段只能根据他们是谁,以及他们试图将状态更新到什么,才能“更新”到给定的值。实际上,我概述的逻辑在序列化程序中如下所示:

代码语言:javascript
复制
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模型的一个实例:

代码语言:javascript
复制
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/ )。

EN

回答 1

Stack Overflow用户

发布于 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传递给序列化程序。很难说得更多而不去看整件事和观点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66598047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档