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

如何将那些Questions 过滤为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 场景的主要内容,如果未能解决你的问题,请参考以下文章

Django之路

Django系列

django 错误

mac电脑安装django ,运行django报错解决

Django 大神带你飞系列~走进Django

django的文档