在django聚合中使用ifnull default

时间:2015-01-19 04:51:59

标签: django default aggregate models annotate

我有以下模型类:

class Goods(models.Model):
    name = models.CharField(max_length=100)

class InRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='in_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

class OutRecord(models.Model):
    goods = models.ForeignKey(Goods, related_name='out_records')
    timestamp = models.DateTimeField()
    quantity = models.IntegerField()

所以,我希望得到一个QuerySet,其中包含所有具有正存储库的商品。

另一种描述方式,我想过滤InRecord数量摘要比OutRecord摘要更多的商品。


我尝试了什么:

首先,我使用annotate将摘要添加到查询集:

qs = Goods.objects.annotate(
        qty_in=Sum(in_records__quantity), 
        qty_out=Sum(out_records_quantity)
    )

这似乎有效,但有一个问题,当某些商品没有相对的in_records或out_records时,注释的字段返回无

问题:那么,在这种情况下我有没有办法设置默认值,就像在SQL中调用ifnull(max(inreocrd.quantity), 0) *一样?


在此之后,我想在该QuerySet上添加一个过滤器:

我试过了:

qs = qs.filter(qty_in__gt(F(qty_out)))

但如果商品上没有记录,它仍无法运作。

请帮忙。

1 个答案:

答案 0 :(得分:3)

您可以使用Django的Coalesce功能。这样的东西应该在Django 1.8或更高版本中起作用:

public static void main(String[] args) {
    Socket socket = null;
    try {
        DataInputStream dis;
        socket = new Socket("192.168.1.48",8000);
        while (true) {
            dis = new DataInputStream(socket.getInputStream());
            int len = dis.readInt();
            byte[] buffer = new byte[len];
            dis.readFully(buffer, 0, len);
            BufferedImage im = ImageIO.read(new ByteArrayInputStream(buffer));
            jlb.setIcon(new ImageIcon(im));
            jfr.add(jlb);
            jfr.pack();
            jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jfr.setVisible(true);
            System.gc();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } 
    finally {
        try {
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}