Tricky Django GenericRelation查询

时间:2010-06-27 12:55:03

标签: django

假设我有几个代表真实生活对象的模型:“”,“主席”,“房间

我还有一个“ Collection ”模型,它代表了这些模型的一些记录集合。

每个模型都可以是集合以外的成员 - 因此,我还创建了一个“ Membership ”模型,它表示一个对象是集合的成员。它的定义如下:

class Membership(models.Model):
   content_type   = models.ForeignKey(ContentType)
   object_id      = models.PositiveIntegerField()
   content_object = generic.GenericForeignKey('content_type', 'object_id')

   collection     = models.ForeignKey('Collection', related_name="members")

我希望能够创建一个 QuerySet ,它给出一个集合,代表给定模型的所有成员 。我知道我可以通过编程方式进行,但我需要在QuerySet中进行,可以过滤,排序等。

修改

显然,这可以使用原始SQL来完成:

   SELECT * FROM 
       ( modelx INNER JOIN membership ON modelx.id = membership.object_id) 
   WHERE 
       ( membership.collection_id=<my-collection-id> AND    
         membership.content_type_id=<modelx-type-id> )

但是可以使用Django查询语言来表示吗?

3 个答案:

答案 0 :(得分:2)

我似乎找到了解决方案,使用QuerySet的{​​{1}}方法:

extra

返回特定模型的有效QuerySet,该模型包含作为特定集合成员的所有记录。

答案 1 :(得分:1)

我在成员资格模型的自定义管理器上通过with_model方法实现了这一点:

class CollectionMemberManager(models.Manager):
    use_for_related_fields = True

    def with_model(self, model):
        return model._default_manager.filter(pk__in=self.filter(member_content_type=ContentType.objects.get_for_model(model)).values_list('member_object_id', flat=True))

CollectionMember相当于您的Membership模型。有关更多背景信息,请参阅the code in its entirety

答案 2 :(得分:0)

不,这是不可能的。查询集只能是一种模型类型。因此,您可以获取Membership个对象的查询集,并引用每个content_object属性,它将为您提供相关对象,但您无法直接在一个查询集中获取所有相关对象。