假设我有几个代表真实生活对象的模型:“人”,“主席”,“房间”
我还有一个“ 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查询语言来表示吗?
答案 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
属性,它将为您提供相关对象,但您无法直接在一个查询集中获取所有相关对象。