Django Generic Relations无法正常工作

时间:2015-10-13 02:46:08

标签: python django

因此,在我的某个模型类中添加或删除GenericRelation后,没有任何反应。

我尝试制作色彩,它告诉我没有检测到任何变化。所以一定有问题,因为它应该击中数据库并尝试应用一些更改。

我遵循了Django的例子,我不能让这种关系发挥作用。

class Person(models.Model):
    identity = models.CharField(max_length=13, verbose_name="ID")
    name = models.CharField(max_length=255, verbose_name="Name")
    board = GenericRelation('second_app.BoardMember') #Second Try

    def __unicode__(self):
        return self.identity

    class Meta:
        verbose_name = "Person"
        verbose_name_plural = "People"

class Student(Person):
    class Meta:
        proxy = True

class Parent(Person):
    class Meta:
        proxy = True

class Teacher(Person):
    board = GenericRelation('second_app.BoardMember') # first try
    class Meta:
        proxy = True

在其他应用中我有以下型号。

class BoardMember(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id', for_concrete_model=False)
    responsabilities = models.CharField(max_length=255)

首先,我尝试在代理模型上设置通用关系。什么都没发生,然后我尝试在主要的Person类上设置它。没有。这就是我在shell上测试关系的方法。

>>>from first_app.models import Teacher
>>>from second_app.models import BoardMember
>>>teacher = Teacher(identity='123456', name='Fermin Arellano')
>>>teacher.save()
>>>bm = Boardmember(content_object=teacher,responsabilities='Check stuff')
>>>bm.save()
>>>teacher.board.all()
[]

遵循此示例:https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#reverse-generic-relations

预期结果应为:[<Teacher: 123456>]

我做错了吗?任何地方都没有错误。正确保存数据,在我的数据库中成功创建了Teacher和BoardMemer对象。

1 个答案:

答案 0 :(得分:1)

我刚刚从GenericForeignKey声明中删除了for_concrete_model=False。虽然在Django的文档中,它明确指出必须将其设置为false才能使用ProxyModels。

Everythings现在工作正常。

修改

我刚才意识到这个问题仍然存在。经过进一步调查后,我注意到为了使通用关系工作,我需要保存 Person 模型的content_type_id,而不是代理模型。{这就是为什么删除for_concrete_model参数有帮助,因为这样我告诉Django使用父类内容类型,并且它工作得很好。有趣的是,如果我执行以下操作,尽管我拥有content_type_id人,但关系仍然有效。

Teacher.objects.filter(board__isnull=False)

这将返回董事会中的所有教师。

这真是令人困惑,如果你能对这个烂摊子有所了解,我会非常感激。