Django queryset根据其他模型属性筛选模型属性

2024-10-02 10:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道我是否用这个题目把自己说清楚了,但是,我的问题是:

我有一个模型,它只是一个事务模型:

class InstanceItemEvaluation(models.Model):
    instance = models.ForeignKey(Instance)
    item = models.ForeignKey(InstanceItem)
    user = models.ForeignKey(User)
    factor = models.ForeignKey(Factor)
    measure = models.ForeignKey(Measure)
    measure_value = models.ForeignKey(MeasureValue, null=True, blank=True)
    evaluated_at = models.DateTimeField(null=True, blank=True)

我必须运行以下查询才能从数据库中检索有效值:

@staticmethod
def get_user_evaluations_by_instance(user, instance):
    qs = InstanceItemEvaluation.objects.filter(
        user=user, 
        instance=instance, 
        factor__is_active=True, 
        measure__is_active=True).exclude(
        factor__measure=None)
    return qs

查询集本身就说明了这一点,我只是在过滤用户和工作实例等等。此查询集输出此SQL:

SELECT "workspace_instanceitemevaluation"."id", 
       "workspace_instanceitemevaluation"."instance_id", 
       "workspace_instanceitemevaluation"."item_id", 
       "workspace_instanceitemevaluation"."user_id", 
       "workspace_instanceitemevaluation"."factor_id", 
       "workspace_instanceitemevaluation"."measure_id", 
       "workspace_instanceitemevaluation"."measure_value_id", 
       "workspace_instanceitemevaluation"."evaluated_at" 
  FROM "workspace_instanceitemevaluation" 
 INNER JOIN "measures_measure" ON ( "workspace_instanceitemevaluation"."measure_id" = "measures_measure"."id" ) 
 INNER JOIN "factors_factor" ON ( "workspace_instanceitemevaluation"."factor_id" = "factors_factor"."id" ) 
 WHERE ("measures_measure"."is_active" = True 
   AND "workspace_instanceitemevaluation"."user_id" = 1 
   AND "factors_factor"."is_active" = True 
   AND "workspace_instanceitemevaluation"."instance_id" = 5 
   AND NOT ("factors_factor"."measure_id" IS NULL));

到目前为止还不错。但现在我需要在查询中加上这个子句:

   AND "factors_factor"."measure_id" = "measures_measure"."id"

这意味着我只寻找当前与我的因子相关的度量值。不管怎样,我试着这样做(看看最后的过滤器):

@staticmethod
def get_user_evaluations_by_instance(user, instance):
    qs = InstanceItemEvaluation.objects.filter(
        user=user, 
        instance=instance, 
        factor__is_active=True, 
        measure__is_active=True).exclude(
        factor__measure=None).filter(
        factor__measure=measure)
    return qs

但这根本说不通。现在我有点困了,找不到解决办法。当然,我可以迭代结果并删除我不需要的结果。但是我正在试图弄清楚是否可以使用djangoquerysetapi实现我提到的这个SQL查询。你知道吗


Tags: andinstanceidtrueismodelsworkspaceactive
1条回答
网友
1楼 · 发布于 2024-10-02 10:30:01

我不确定它在这种情况下是否有效,但通常可以使用F()对象。你知道吗

from django.db.models import F
qs = InstanceItemEvaluation.objects.filter(
    user=user, 
    instance=instance, 
    factor__is_active=True, 
    measure__is_active=True).exclude(
    factor__measure=None).filter(
    factor__measure=F('measure_id'))

相关问题 更多 >

    热门问题