【发布时间】:2020-09-14 08:42:50
【问题描述】:
在 Django 中,设置并保持最新的多对多字段的最佳方式是什么,该字段是(由于缺乏更好的术语)来自其他模型的多对多字段的组合?
举个具体的例子,我有一个代表简历的模型。
class Resume(models.Model):
owner = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="resume",
)
description = models.TextField(default="Resume description")
skills = models.ManyToManyField(Skill, related_name="resume")
Resume 对象被另一个名为 WorkExperience 的模型引用:
class WorkExperience(models.Model):
...
skills = models.ManyToManyField(Skill, related_name="work")
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=False,
default=1,
related_name="work_experience",
)
resume = models.ForeignKey(
Resume,
on_delete=models.CASCADE,
null=False,
default=1,
related_name="work_experience",
)
请注意,这里有相当多的冗余,Resume 和 WorkExperience 都指向同一个所有者等。也就是说,这两个模型(Resume 和 WorkExperience)都有一个名为 Skills 的字段。这引用了另一个名为 Skills 的模型。
我想要的是让 Resume 技能指向与 WorkExperience 中的技能相同的技能。关于如何做到这一点的任何建议?我还有一个名为 EducationExperience 的模型,它也引用了 Skills 并且与 Resume 有外键关系。有什么方法可以让 Resume 中的技能与 WorkExperience 和 EducationExperience 中的技能保持同步?
一个简单的选择是实现一个名为 set_resume_skills 的方法,该方法在调用时会将他们拥有的技能添加到 Resume 拥有的技能列表中
Class WorkExperience(models.Model):
# Same model as above
def set_resume_skills(self):
self.resume.skills.add(self.skills)
我对这种方法的问题是它只会增加技能,并不能真正让它们保持同步。因此,如果我从 WorkExperience 中删除一项技能,它不会从 Resume 中删除。另一个边界条件是,如果多个 WorkExperience 对象正在引用一项技能,然后我从一个对象中删除了该技能,我将如何确保 Resume 中的引用仍然完好无损?即,两个工作经验对象指的是技能“Javascript”。我从一个 WorkExperience 对象中删除了技能。技能“Javascript”仍应被 Resume 引用,因为一个 WorkExperience 对象仍然具有对它的引用。
编辑:我想这样做的原因是为了减少在前端完成的查询量。如果过滤技能的唯一方法是通过“子模型”(WorkExperience、EducationExperience),我需要在前端执行两个查询而不是一个。虽然现在想想,做两个查询也不错。
【问题讨论】:
标签: python django django-models foreign-keys many-to-many