使用Django,如何使用查询集计算可用架子空间量?

时间:2019-01-16 16:36:51

标签: django django-queryset

我正在开发一个库存管理网络应用程序,该应用程序允许组织中的团队分配用于存储物品的盒子。

有多个储藏室以及多个架子和部分。每个盒子都分配有一个项目。

enter image description here

我想在Django中编写一个查询集,以显示给定房间中有多少个空白空间(有多少个位置没有分配框的位置),例如上面的图片显示了房间A

房间:A 空白:4

这是我的代码的简化版本:

HTML:

{% for each_space in Room_data %}

{
<p>"Room": "Room {{each_space.loc_room}}",</p>
<p>"Empty Spaces": *** HERE I NEED HELP ***,</p>
},
{% endfor %}

型号:

class Location(models.Model):
    loc_room = models.CharField()
    loc_section = models.IntegerField()
    loc_shelf = models.CharField()


class Box(models.Model):
    box_contents = models.CharField() 
    project_assigned_to = models.ForeignKey()
    Location = models.OneToOneField()

class Project(models.Model):
    project_name = models.CharField()
    project_manager = models.ForeignKey()

观看次数:

def dashboard(request):
    Room_data = Location.objects.all()
    return render(request, 'main_app/dashboard.html' , {"Room_data":Room_data})

今天很多时候我一直坚持这一点,所以我希望有人可能知道前进的最佳方向。预先谢谢你。

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法获取不含Box的位置的列表:

Location.objects.filter(box__isnull=True)

或更简单:

Location.objects.filter(box=None)

对于给定的房间QuerySet,我们可以获得具有Location个这样的some_room的{​​{1}}:

Location.objects.filter(box=None, loc_room=some_room)

这将导致查询如下:

SELECT location.*
FROM location
LEFT OUTER JOIN box ON location.id = box.Location_id
WHERE box.id IS NULL
AND   location.loc_room = some_room

我们还可以通过以下方式计算Location的数量:

Location.objects.filter(box=None, loc_room=some_room).count()

如果您要在每个房间中检索个空位置,我们可以为这些位置添加注释,例如:

Location.objects.values(
    'loc_room'
).filter(
    box__isnull=True
).annotate(
    nempty=Count('id')
).order_by('loc_room')

然后我们可以像这样打印这些:

{% for each_space in Room_data %}
<p>"Room": "Room {{ each_space.loc_room }}",</p>
<p>"Empty Spaces": {{ each_space.nempty }},</p>
{% endfor %}