在没有直接关系的情况下进行预取Django

时间:2018-10-01 14:37:08

标签: python sql django

在Django中,有没有直接外键关系的预取方法?

或者具体地说,是基于两列的值进行预取?

我有模特

class ProductionType(models.Model  ):
    name = models.CharField(max_length=100,default="New Job Progress Type")
    def __str__(self):
        return  self.name
    def label_from_instance(self, obj):
        return "{0}".format(obj.name)

class ProductionRecord(models.Model):

    job = models.ForeignKey(Job,null=True,on_delete=models.SET_NULL,related_name="production_records")
    type = models.ForeignKey(ProductionType,null=True)
    done = models.IntegerField(default=1)

然后在另一个应用程序中

class ShopProgress(models.Model  ):

    job= models.ForeignKey(Job, on_delete=models.CASCADE, related_name="shop_progress")
    total=models.IntegerField(null=True)
    type=models.ForeignKey(ProductionType,on_delete=models.CASCADE)

    @property
    def done(self):

        x = ProductionRecord.objects.values_list("done").filter(job=self.job, type=self.type).aggregate(models.Sum('done'))
        t =x["done__sum"]
        if t == None or t== 0:
            t=0
        self._done=t
        return t

ProductionRecord和ShopProgress都引用作业和生产类型。 因此,该关系取决于这两个字段,而不是直接的外键。

在这种情况下,我希望在查询ShopProgress时预取“ ShopProgress.done()”中的查询。

相似的原始查询大致类似于

select a.id, a.type_id, a.total ,sum(b.done), a.job_id from DailyProgressReport_shopprogress a
left join production_productionrecord b on b.type_id=a.type_id and b.job_id = a.job_id
group by a.job_id, a.type_id
order by a.id

我希望这个问题是简洁的。如果没有,请告诉我,我会尽力提供进一步的说明。

0 个答案:

没有答案