问题描述
我试图通过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')
预先感谢
解决方法
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))