代码之家  ›  专栏  ›  技术社区  ›  Shale

如何将此查询更改为ORM?

  •  0
  • Shale  · 技术社区  · 2 年前

    嗨我有两个这样的模型,

    class Sample(models.Model):
        name = models.CharField(max_length=256)  ##
        processid = models.IntegerField(default=0)  # 
    
    
    class Process(models.Model):
        sample = models.ForeignKey(Sample, blank=False, null=True, on_delete=models.SET_NULL, related_name="process_set")
        end_at = models.DateTimeField(null=True, blank=True) 
    

    我想加入样本和流程模型。因为样本与流程相关,我想通过样本获取流程信息。

    
    SELECT sample.id, sample.name, process.endstat
    FROM sample
    INNER JOIN process 
    ON sample.processid = process.id 
    AND process.endstat = 1;
    

    (我正在使用SQLite)

    我曾经

    sample_list = sample_list.filter(process_set__endstat=1))
    

    但它回来了

    
    SELECT sample.id, sample.name
    FROM sample
    INNER JOIN process 
    ON (sample.id = process.sample_id) 
    AND process.endstat = 1)
    

    这是 我想要什么。

    我怎样才能解决这个问题?

    1 回复  |  直到 2 年前
        1
  •  1
  •   lord stock    2 年前

    这应该对你有用

    Process.objects.filter(end_at=1).values('sample__id','sample__name','end_at') 
    
    .values() method returns selective table fields.
    
        2
  •  1
  •   sayeed910    2 年前

    我猜 sample_list = Sample.objects .

    过滤模型时,仅选择模型中定义的字段。在你的例子中, id and processid .如果要从相关模型中检索值作为单个记录,则需要使用 values or values_list .要获得所需的查询,必须执行以下操作

    sample_list = sample_list.filter(process_set__endstat=1).values('id', 'name', 'process__endstat')
    

    顺便说一句,Django有 JOIN 在外键字段。所以,你不能 ON sample.processid = process.id 因为processid不是ForeignKey字段。

    参考: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#values

        3
  •  0
  •   Shale    2 年前

    我发现 加入非外键字段 在django。

    sample_list = sample_list.filter(processid__in=Process.objects.filter(endstat=1)
    

    我用了 Django-queryset join without foreignkey