Python Django-如何构建GenericRelation查询?

Python Django-如何构建GenericRelation查询?,python,django,django-queryset,django-generic-relations,Python,Django,Django Queryset,Django Generic Relations,我试图通过点击表访问所有不同的模型对象。我不明白的是为什么我无法构建实际的查询来实现这一点。我只想获取queryset_m1-m3中的所有对象,其中Model1-3.pk是hit.object_id,因为hit.object_id是Model1、2或3的相关对象的主键 def recently_viewed_proposals(): hit = Hit.objects.all() queryset_m1 = Model1.objects.filter(pk=hit.object_

我试图通过点击表访问所有不同的模型对象。我不明白的是为什么我无法构建实际的查询来实现这一点。我只想获取queryset_m1-m3中的所有对象,其中Model1-3.pk是hit.object_id,因为hit.object_id是Model1、2或3的相关对象的主键

def recently_viewed_proposals():
    hit = Hit.objects.all()
    queryset_m1 = Model1.objects.filter(pk=hit.object_id)
    queryset_m2 = Model2.objects.filter(pk=hit.object_id)
    queryset_m3 = Model3.objects.filter(pk=hit.object_id)
    hit_elements = chain(
        queryset_m1.random(len(queryset_m1)),
        queryset_m2.random(len(queryset_m2)),
        queryset_m3.random(len(queryset_m3))
    )
    elements_list = list(hit_elements)
    n_proposals = min(len(elements_list), config.MAX_RECENTLY_VIEWED_PROPOSALS)
    recently_viewed_proposals = random.sample(elements_list, n_proposals)
    return recently_viewed_proposals
这就是我的Hit model类的外观:

...

class Hit(models.Model):
    content_type = models.ForeignKey(ContentType, limit_choices_to=hit_models, on_delete=models.CASCADE)
    object_id = models.CharField(max_length=36)
    content_object = GenericForeignKey('content_type', 'object_id')
    viewer = models.ForeignKey(User, verbose_name="Viewer", on_delete=models.CASCADE)
    counted = models.BooleanField(verbose_name="Counted", default=False, editable=True)
    date_added = models.DateTimeField(auto_now=True)
但我总是陷入以下问题:

“QuerySet”对象没有属性“object\u id”

当然,我的模型1-3包含以下字段:

hits = GenericRelation(Hit, related_query_name='hit')
提前谢谢

hit = Hit.objects.all() 
正在返回一个queryset(所有点击的“django列表”),因此无法执行以下操作

queryset_m1 = Model1.objects.filter(pk=hit.object_id)
queryset_m2 = Model2.objects.filter(pk=hit.object_id)
queryset_m3 = Model3.objects.filter(pk=hit.object_id)
原因对象_id不是queryset的属性

您可以执行以下操作,它应该可以工作:

queryset_m1 = Model1.objects.filter(pk__in=hit.filter(content_type_id=id_model_1).values_list('id', flat=True))

很酷,但我不太明白“内容\类型\ id=id\模型\ 1”应该是什么?你能解释一下或者至少提供一些东西来填充这个场景的占位符吗?谢谢你,我几乎以任何方式测试了你的答案,也测试了裸内容类型id,在我的例子中是12、15和20,可惜没有成功。实际上我更喜欢这种方式:>>>=hit.filter(content_type=str(hit.content_type)==“App | Model1”<<因为你永远不知道内容ID,如果你重新部署你的应用程序,它也不总是一样的。但无论如何,这个答案对我来说似乎是错误的。唯一返回的是:…@sunwave121你得到了什么是一个iterable,因为您正在使用chain(),然后需要在您的案例中将其转换为列表,就像您在执行元素时一样\u list=list(hit\u elements)嘿,谢谢您的回复。我需要转换为列表的具体内容是什么?当前打印(最近查看的\u提案)返回[]…因此,如果我使用content\u type\u id=12、15、20,则它似乎是空的。此外,n\u建议返回0为了避免误解,我正在尝试查询我的命中表中的Model1、2、3对象