首页 > 解决方案 > 使用另一个模型添加模型约束

问题描述

我目前正在开发一个包含候选人、应用程序和工作模型的应用程序跟踪应用程序。

理想情况下,我希望候选人只申请一次工作,但如果他们愿意,候选人应该能够申请另一份工作。

我遇到的问题是由于应用程序模型位于候选人和工作之间,我不确定在哪里添加约束 - 应用程序模型通过定义的关系“检测”候选人是否已经存在于工作中在应用程序模型中。

添加唯一约束将只允许候选人在整个过程中应用一次,因此这并不理想。

这是我的models.py


     class Candidate(models.Model):
            # Candidate Personal and Contact Information
            date_created = models.DateTimeField(auto_now_add=True)
            first_name = models.CharField(max_length=120)
            last_name = models.CharField(max_length=120)
            email = models.EmailField()
            phone = models.CharField(max_length=30)

        # Candidate Location Information
        city = models.CharField(max_length=120)
        state = models.CharField(max_length=120)
        country = CountryField(blank_label='Select Country')
        zip_code = models.CharField(max_length=10)

        def __str__(self):
            return f'{self.first_name} {self.last_name}'


class Application(models.Model):

    # Application Status Choices 
    class ApplicationStatus(models.TextChoices):
       ...


    # Application Stages Choices 
    class ApplicationStage(models.TextChoices):
       ...


    # Job-related Information
    date_applied = models.DateTimeField(auto_now_add=True)
    job = models.ForeignKey('Job', on_delete=models.CASCADE)
    application_status = models.CharField(max_length=120,
                                          choices=ApplicationStatus.choices,
                                          default=ApplicationStatus.ACTIVE)
    stage = models.CharField(max_length=120,
                             choices=ApplicationStage.choices,
                             default=ApplicationStage.APPLICATION)

    # Applicant Information
    candidate = models.ForeignKey(Candidate, 
                                  related_name='applications', 
                                  on_delete=models.CASCADE)
    resume = models.FileField()

    def __str__(self):
        return str(self.job)


class Job(models.Model):

    # Job Status Choices
    class JobStatus(models.TextChoices):
        ...


    # Employment Type Choices
    class EmploymentType(models.TextChoices):
        ...

    date_created = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, models.SET_NULL, blank=True, null=True)
    job_status = models.CharField(max_length=120,
                                  choices=JobStatus.choices,
                                  default=JobStatus.DRAFT)
    employment_type = models.CharField(max_length=120,
                                       choices=EmploymentType.choices,
                                       default=EmploymentType.FULL_TIME)
    compensation_min = models.DecimalField(max_digits=6, decimal_places=2)
    compensation_max = models.DecimalField(max_digits=6, decimal_places=2)
    title = models.CharField(max_length=120)
    description = models.TextField()

    def __str__(self):
        return self.title

这是我的serializers.py

from rest_framework import serializers
from rct.models import (Candidate,
                        Application,
                        InterviewSchedule,
                        Scorecard,
                        Job)


class CandidateSerializer(serializers.ModelSerializer):
    applications = serializers.StringRelatedField(many=True, read_only=True)
    class Meta: 
        model = Candidate
        fields = '__all__'


class ApplicationSerializer(serializers.ModelSerializer):
    class Meta: 
        model = Application
        fields = '__all__'


class JobSerializer(serializers.ModelSerializer):

    class Meta: 
        model = Job
        fields = '__all__'

如果有人能指出我正确的方向,我将不胜感激。谢谢你。

标签: pythondjangodjango-rest-framework

解决方案


您可以在模型Meta类中的jobcandidate字段上使用 unique_together 索引。要获取更多信息,请访问官方模型选项文档。Application


推荐阅读