【发布时间】:2017-06-06 16:34:07
【问题描述】:
这是我在一个描述图表的应用程序中的模型(准确地说是DAG):
class Node(models.Model):
name = models.CharField(max_length=120, blank=True, null=True)
parents = models.ManyToManyField('self', blank=True, symmetrical=False)
def list_parents(self):
return self.parents.all()
def list_children(self):
return Node.objects.filter(parents=self.id)
def list_withindirect(self, arg):
direct = getattr(self, arg)()
withindirect = set(direct)
for d in direct:
withindirect |= set(d.list_withindirect(arg))
return list(withindirect)
def list_ancestors(self):
return self.list_withindirect('list_parents')
def list_descendants(self):
return self.list_withindirect('list_children')
def list_of_allowed_parents(self):
return list(
set(Node.objects.all()) - set(self.list_descendants()) - {self}
)
def __str__(self):
return self.name
每个节点可以有许多其他节点作为父节点。这里的要点是,给定节点具有一组特定的允许父节点。这就是list_of_allowed_parents 方法的用途。但是我怎样才能让表单在下拉列表中只显示这些节点?
目前是这种形式:
class NodeForm(forms.ModelForm):
class Meta:
model = Node
fields = ['name', 'parents']
我向管理员注册:
class NodeAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'list_parents', 'list_children']
form = NodeForm
admin.site.register(Node, NodeAdmin)
我想我将不得不使用类似的东西:
parents = forms.ModelMultipleChoiceField(queryset=node.list_of_allowed_parents())
但是我如何将特定的 node 传递给 forms.py 中的定义?
理想情况下,此约束将添加到模型中。 ManyToManyField提供了choices和limit_choices_to的参数,但是这里好像没有办法添加self.list_of_allowed_parents。
【问题讨论】:
标签: django-models django-forms many-to-many directed-acyclic-graphs