Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景
Posted
技术标签:
【中文标题】Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景【英文标题】:Django ForeignKey.limit_choices_to with ForeignKey to ManyToMany scenario 【发布时间】:2021-09-18 09:42:06 【问题描述】:我有一个复杂的关系场景,如下所示。我想要与JobChecklistAnswer.question
上的JobChecklistAnswer.job_checklist.checklist
相关的limit_choices_to
Questions
。
如何将那些Question
s 过滤为Q object (or callable as the docs say)?
class Checklist(models.Model):
name = models.CharField(_("name"), max_length=150)
description = models.CharField(_("description"), max_length=150)
class Question(models.Model):
checklist = models.ForeignKey(Checklist, on_delete=models.CASCADE)
question = models.CharField(_("question"), max_length=200)
class Job(models.Model):
...
...
class JobChecklist(models.Model):
job = models.ForeignKey(Job, on_delete=models.CASCADE)
checklist = models.ForeignKey(Checklist, on_delete=models.CASCADE)
class JobChecklistAnswer(models.Model):
job_checklist = models.ForeignKey(JobChecklist, on_delete=models.CASCADE)
# FIXME: Add limit_choices_to query question
question = models.OneToOneField(ChecklistItem, on_delete=models.CASCADE)
answer = models.TextField(_("answer"))
【问题讨论】:
你不能用这个来限制选择。您需要在显示选项的表单中限制选项。 【参考方案1】:与 OneToOneField“反向”关系相比,ForeignKey“反向”关系返回一个 QuerySet。
您没有在 OneToOneField 中返回查询集,您只是在反转它们之间的关系
所以第一步就是把OneToOneField改成ForeignKey
那么你可以在 ForeignKey
上使用 limit_choices_to 属性【讨论】:
将其转换为unique=True
FK 没问题,但仍然找不到为limit_choices_to
编写查询集的方法以上是关于Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景的主要内容,如果未能解决你的问题,请参考以下文章