【问题标题】:Django - how to build a GenericRelation query?Django - 如何构建 GenericRelation 查询?
【发布时间】:2023-04-09 06:05:01
【问题描述】:

我正在尝试通过 Hit 表访问我所有不同的模型对象。我不明白为什么我无法构建实际的查询来做到这一点。我只想获取 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 模型类的样子:

...

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_id'

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

hits = GenericRelation(Hit, related_query_name='hit')

提前致谢

【问题讨论】:

    标签: python django django-queryset django-generic-relations


    【解决方案1】:
    hit = Hit.objects.all() 
    

    正在返回一个查询集(所有命中的“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)
    

    因为object_id不是queryset的属性

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

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

    【讨论】:

    • 酷,但我不完全明白“content_type_id=id_model_1”应该是什么?你能解释一下或者至少提供一些东西来填充这个占位符吗?谢谢
    • 好吧,我几乎以任何方式测试了你的答案,也用我的情况下是 12、15 和 20 的裸 content_type_id,遗憾的是没有成功。实际上我更喜欢这种方式: > > =hit.filter(content_type=str(hit.content_type) == 'App | Model1' ...
    • @sunwave121 你得到的“”是一个可迭代的,因为你使用的是chain(),然后你需要在你的情况下将它转换成一个列表正在做 elements_list = list(hit_elements)
    • 您好,谢谢您的回复。我到底需要什么转换成列表?目前 print(recently_viewed_proposals) 返回 [] ...因此,如果我执行 content_type_id=12、15、20,它似乎还是空的。n_proposals 也返回 0
    • 为了防止误解,我正在尝试在我的命中表中查询 Model1、2、3 的对象
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2013-08-12
    • 2019-06-24
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多