繁体   English   中英

在Django中正确使用具有自引用外键的子类/代理?

[英]Correctly using subclasses/proxies in django that have self referential foreign keys?

我有两个班,一个超级班。 本质上,这两个类是树上的具体类。 一个是叶子,一个是树枝。 它们共享在超类中定义的属性。

以下课程均未完成。 我尝试过使超类抽象,也使子类代理。 希望下面的代码能解释我要实现的目标。

这是“超一流”

class Owner(models.Model):
    name = models.CharField(max_length=200)
    def __unicode__(self):
        return self.name
    class Meta:
        abstract=True

这是“叶子”

class User(Owner):
    pass

这是“分支”。

class Group(Owner):
    head = models.ForeignKey(User)
    members = models.ManyToManyField(Owner,through='Membership')

这显示了用户如何通过成员资格属于一个组。

class Membership(models.Model):
    date_joined = models.DateField()
    user = models.ForeignKey(Owner)
    group = models.ForeignKey(Group)

我的限制是每个用户可以属于多个组(通过链接器Membership )。 每个组可以是单个组的成员。

之所以失败,是因为我在用户身份和组成员身份中都引用了所有者。 我觉得这是我可以使用Java中的泛型解决的事情,但这在这里无济于事。

我也看到了CONTENTTYPES用于这样的事情,但他们似乎对我想要做的太复杂了。 我错了吗? 我不知道如何将这种范例应用于我的示例。 我也找到了这个问题,但是我仍然不确定应该如何实现。

您不能有指向抽象类的外键字段(数据库中没有用于抽象类的表)。

您可能需要实现每个Group属于零个或一个组的自引用外键。 像这样:

class Base(models.Model):
    name = models.CharField(max_length=200)
    def __unicode__(self):
        return self.name
    class Meta:
        abstract=True


class User(Base):
    groups = models.ManyToManyField('Group', through='Membership', related_name='members')


class Group(Base):
    head = models.ForeignKey(User)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')

    def descendants(self, **kwargs):
        qs = self.children_set.filter(**kwargs)
        for group in self.children_set.all():
            qs = qs | group.descendants(**kwargs)
        return qs


class Membership(models.Model):
    date_joined = models.DateField()
    user = models.ForeignKey(User)
    group = models.ForeignKey(Group)

上面的Base类除了指示每个继承的类在其各自的DB表和__unicode__方法中都有一个name字段外,别无其他。 您可以简单地将name字段和__unicode__方法复制并粘贴到UserGroup ,这在功能上是相同的。 具有公共抽象父级不会创建任何数据库关系,并且您不能使用它来查询数据库。

在这种情况下,我真的看不到使用代理类的任何原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM