12

我想要一个有 2 个字段的模型,孩子和父母。我如何在 django 中做到这一点?我有这样的东西

from django.db import models
class FooModel(models.Model)
    parent = models.ForeignKey('self', blank=True, null=True)
    children = models.ManyToOneRel('self', blank=True, null=True)

    def __init__(self, *args, **kwargs):
        super(FooModel, self).__init__(*args, **kwargs)
        self.parent.children.add(self)

但我认为我不应该像这样使用 ManyToOneRel(尤其是因为它在“空白”上给了我一个关键字错误)。有什么建议吗?

4

3 回答 3

24

ManyToOneRel是一个内部实现类,它不适用于您的模型。

但是为什么你认为你仍然需要它?正如文档中详细解释的那样,当您定义 ForeignKey 时,您会自动获得反向关系。因此,在您的情况下,如果您定义,parent那么您将自动获得:并且您可以通过使用参数self.foomodel_set使其更加明确:related_name

parent = models.ForeignKey('self', blank=True, null=True, related_name='children')

请注意,如果您打算用树做复杂的事情,您可能想要使用django-mptt库。

于 2013-03-18T21:37:07.637 回答
3
class FooModel(models.Model)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')


FooModel.objects.get(pk=1).children.all()

如果您希望缓存使用您想要的任何内容:在某处缓存查询,将所有子项存储在父项中作为 pks 的平面列表,但不要忘记处理新实体以更新此列表。ManyToOneRel 用于 django 的内部需求,而且它不是 Field 类的实例。

于 2013-03-18T21:18:52.910 回答
0

我找不到它的文档,ManyToOneRel所以我查找了它的代码

def __init__(self, to, field_name, related_name=None, limit_choices_to=None,
        parent_link=False, on_delete=None):

如您所见,没有blank争论。

于 2013-03-18T21:13:39.620 回答