使用通用GenericForeignKey

时间:2013-01-30 04:45:54

标签: django django-models

我想在我当前的设置中添加一个新模型,如下所示

class Cinerama(models.Model):
    memeber = models.ManyToManyField(Person)
    #somethins

但问题是我没有人模型我有这样的男孩和女孩模型

class Girls(models.Model):
    #somethins only girls do
    #many other fk
    teacher = models.ForeignKey(Teacher)

class Boys(models.Model):
    #somethins only boys do
    #many other fk
    teacher = models.ForeignKey(Teacher)

所以我不想改变设置,所以我想为女孩和男孩添加标签然后制作一个新的人模型,以便系统看起来像这样

class Person(models.Model):
    slug = models.SlugField()

class Cinerama(models.Model):
    members = models.ManyToManyField(Person)
    #somethins

class Girls(models.Model):
    #somethins
    teacher = models.ForeignKey(Teacher)
    tag= models.ForeignKey(Person)

class Boys(models.Model):
    #somethins
    teacher = models.CharField()
    tag= models.ForeignKey(Person)

这将是采用或使用generic的最佳选择.GenericForeignKey会更好,你将如何检索由pk = 1的老师带到Cinerama的所有学生,

1 个答案:

答案 0 :(得分:0)

此处需要通用外键。它们也是其他替代品,例如创建一个人模型并扩展你的男孩和女孩模型。通用关系可以创建为:

class Cinerama(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    # other fields here

还在您的女孩和男孩模型中添加反向关系,以便您可以Girls.cinerama.all()

class Girls(models.Model):
    cinerama = generic.GenericRelation(Cinerama)
    # other fields here