Django 限制ManyToManyField声明中的选项
我已将代码剥离到相关部分 在我的模型定义中,这里有3个相关的类:项目,员工,办公桌 每个办公桌通过一个外键链接到一个项目Django 限制ManyToManyField声明中的选项,django,django-models,Django,Django Models,我已将代码剥离到相关部分 在我的模型定义中,这里有3个相关的类:项目,员工,办公桌 每个办公桌通过一个外键链接到一个项目 在我对课桌的定义中,我有以下几行: project = models.ForeignKey(Project) 现在,每个员工也以完全相同的方式与一个项目相关 我的问题来了: 我试图将每个办公桌与不同的员工联系起来,因此我添加了以下行: employee = models.ManyToManyField(Employee, null=True, blank=True) 但我
在我对课桌的定义中,我有以下几行:
project = models.ForeignKey(Project)
现在,每个员工也以完全相同的方式与一个项目相关
我的问题来了: 我试图将每个办公桌与不同的员工联系起来,因此我添加了以下行:
employee = models.ManyToManyField(Employee, null=True, blank=True)
但我不希望每个员工都能链接到给定的办公桌我希望能够将办公桌链接到与同一项目链接的员工 我已尝试将我的行修改为以下内容:
employee = models.ManyToManyField(Employee, null=True, blank=True, limit_choices_to={'project': project})
但我得到了以下错误:
Error when calling the metaclass bases
int() argument must be a string or a number, not 'ForeignKey'
我已尝试将线路更改为:
limit_choices_to={'project': project.id}
limit_choices_to={'project': project.pk}
limit_choices_to={'project': self.project}
limit_choices_to={'project': self.project.pk}
还有许多其他的变化,但都没有给出任何结果
欢迎任何建议。您可以在表单中使用
queryset
,而不是将模型中的选项限制为,并将project\u id
传递到表单或从表单实例(form.instance.project
)加载它:
实际上我有两种不同的形式。一个用于桌面创建,其中员工字段隐藏且为空;另一个用于桌面编辑,其中项目始终已存在。我想这解决了一个问题。但是,如果查询集仅在第一次加载时更新,则可能会出现矛盾,因为其他用户可能会在两次不同加载之间更新列表。是否可以在每次调用表单时更新查询集?我的意思是,如果我删除kwargs中的“if‘initial’”?它还能工作吗?是的,你可以删除它,\uuuuu init\uuuu
方法被称为每个表单实例化。好的,我将使用你的解决方案,因为它工作完美,似乎符合我的所有要求!谢谢!事实上,我对你的解决方案有意见。在选择框中,我只得到我想要的员工,这很完美。但是,在验证更改后,我会收到一条错误消息,告诉我需要做出有效的选择,而N不是有效值。(N是所选员工的id)。
class YourFormForm(forms.ModelForm):
def __init__(self, project_id, *args, **kwargs):
super(YourFormForm, self).__init__(*args, **kwargs)
if 'initial' in kwargs:
self.fields['employee'].queryset = Employee.objects.filter(project_id=self.instance.project_id)