python - Django - 如何构建 GenericRelation 查询?
问题描述
我正在尝试通过 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
这就是我的命中模型类的样子:
...
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'
当然,我的 Model(s)1-3 包含以下字段:
hits = GenericRelation(Hit, related_query_name='hit')
提前致谢
解决方案
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_m1 = Model1.objects.filter(pk__in=hit.filter(content_type_id=id_model_1).values_list('id', flat=True))
推荐阅读
- tensorflow - 带有 tf.cond 的 TensorFlow 自定义激活函数
- java - JNA 的行为与我的 C# 对应物不同,为什么?
- css - 要并排放置的表单域
- c#-4.0 - 仅更改一个 Console.WriteLine 的颜色
- javascript - 通过单击按钮在 html 页面上显示名称。该按钮是使用数据库中的数据生成的
- shopify - 如何为我的 Shopify 产品动态设置 SEO 标题和描述
- javascript - 在每个间隔后都有一个循环来改变卡片的样式
- unit-testing - 尝试使用 Jest 模拟 fs.readFileSync 时出错
- azure-devops - Azure DevOps Board - 我可以添加新列,根据某些标准(例如“标签”值)汇总特定故事(故事点)的列表
- java - java中的休眠ManyToOne ORM在一侧持久化对象时获取重复行