gpt4 book ai didi

django - 棘手的 Django GenericRelation 查询

转载 作者:行者123 更新时间:2023-12-04 06:51:02 24 4
gpt4 key购买 nike

假设我有几个代表现实生活对象的模型:“人”、“椅子”、“房间”

我还有一个“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 中使用它,它可以被过滤、排序等。

编辑:

显然,这可以使用原始 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 查询语言来表示吗?

最佳答案

看来我已经找到了解决方案,使用 QuerySetextra方法:

def members_of_model(collection,cls):
cls_type = ContentType.objects.get_for_model(cls)
cm_tablename = CollectionMembership._meta.db_table
cls_tablename = cls._meta.db_table
return cls.objects.all().extra(tables=[cm_tablename],
where=[ '%s.content_type_id=%%s' % cm_tablename,
'%s.collection_id=%%s' % cm_tablename,
'%s.object_id=%s.id' % (cm_tablename, cls_tablename) ],
params=[cls_type.id,collection.id] )

这将返回特定模型的有效 QuerySet,该模型保存作为特定集合成员的所有记录。

关于django - 棘手的 Django GenericRelation 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com