python - 使用另一个模型添加模型约束
问题描述
我目前正在开发一个包含候选人、应用程序和工作模型的应用程序跟踪应用程序。
理想情况下,我希望候选人只申请一次工作,但如果他们愿意,候选人应该能够申请另一份工作。
我遇到的问题是由于应用程序模型位于候选人和工作之间,我不确定在哪里添加约束 - 应用程序模型通过定义的关系“检测”候选人是否已经存在于工作中在应用程序模型中。
添加唯一约束将只允许候选人在整个过程中应用一次,因此这并不理想。
- 候选人 A -> 申请 A -> 工作 A # 应该可以工作
- 候选人 A -> 应用程序 A -> 工作 A # 应该抛出错误
- 候选人 A -> 申请 B -> 工作 B # 应该可以工作
这是我的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__'
如果有人能指出我正确的方向,我将不胜感激。谢谢你。
解决方案
您可以在模型Meta类中的job
和candidate
字段上使用 unique_together 索引。要获取更多信息,请访问官方模型选项文档。Application
推荐阅读
- javascript - React/TypeScript 错误:运算符 '<' 不能应用于类型 'boolean' 和 'RegExp'
- firebase-cloud-messaging - Firebase 云消息传递是否会检测设备何时重新上线?
- django - Unable to load Django YAML fixture file
- javascript - 我的简单反应组件没有在 jsfiddle 上呈现?
- python - mypy argument after ** must be a mapping
- python - Pandas:使用 groupby 计算添加标志
- vue.js - 如何将 vue-router 与 vue-touch-events 一起使用
- javascript - 找不到模块“./routes/viewInprogressDetails”(带有 docker 的节点应用程序)
- automata - 证明,对于任何语言 L1 和 L2,我们有 (1)。L1L1^* = L1^*L1L1^*
- asp.net-mvc - 删除“fileExtension”并将“mimeMap”添加到我的 Azure 服务器配置文件中