django外键查找聚合数据

时间:2016-09-14 03:07:49

标签: django django-models django-views

我正在制作工具库存/跟踪系统。我目前的问题是如何收集当前检出的工具总数,并从我对该工具的总数量中减去该数量。这样我就可以在手边显示数量。因此,用户可以确保该工具当前在商店中,并且不会由借用它的人签出。

模特:

class ActiveTransactionManager(models.Manager):
    def get_queryset(self):
        return super(ActiveTransactionManager, self).get_queryset().filter(CheckInDate = None)

class Tool(models.Model):
    ToolID=models.CharField(max_length=100, primary_key = True, unique=True, db_column='ToolID')
    Quantity=models.IntegerField(null=False)
    Location=models.CharField(max_length=100, null=False)
    CategoryID=models.IntegerField(null=True)
    Deleted=models.BooleanField(default=0)

    objects=models.Manager()

    class Meta:
        managed=True
        db_table='Tool'
    def __unicode__(self):
        return self.ToolID

    def get_absolute_url(self):
        return reverse("ToolSearch:toolSearchResults", kwargs={"pk": self.ToolID})

class ToolCheckIn(models.Model):
    CheckOutID=models.AutoField(primary_key=True)
    ToolID=models.ForeignKey(Tool, db_column='ToolID', on_delete=models.CASCADE,)
    PartyID=models.ForeignKey(Borrower, db_column='PartyID', on_delete=models.CASCADE,)
    Quantity=models.IntegerField(null=False)
    CheckOutDate=models.DateField(null=False, default=datetime.datetime.now)
    CheckInDate=models.DateField(null=True)
    Deleted=models.BooleanField(default=0)

    objects=ActiveTransactionManager()

    class Meta:
        managed=True
        db_table='ToolTransaction'
        ordering=('CheckOutID',)
    def __unicode__(self):
        return str(self.CheckOutID)

    def get_absolute_url(self):
        return reverse("ToolSearch:toolCheckin", kwargs={"pk": self.CheckOutID})

查看:

def tool_search(request):
    if request.method == 'POST':
        instance = None
        pk = (request.POST.get('toolid', 'Nothing Found'))
        instance = Tool.objects.all().filter(ToolID__icontains=pk)
        context = {
            "ToolID": instance
        }
        return render(request, "toolsearchresults.html", context)

    return render(request, "toolsearch.html")

我收到此错误:相关字段无效查找:icontains 我删除了上面列出的导致错误的视图中的代码行: queryset = ToolCheckIn.objects.all()。filter(ToolID_id__icontains = pk)

不确定我是否可以从ORM实现此目的,或者我是否需要编写一些原始sql来实现此目的。我目前正在使用MYSQL数据库。

任何想法或想法将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

将评论中的重要信息添加到答案中。

在您的情况下,合适的包含查询将是

if ((x == undefined || x == '') || (y == undefined || y == '')){
   z = false;
}else {
   z = true;
}

基本上,如果ToolCheckIn.objects.all().filter(ToolID__ToolID__contains=p‌​k) 模型中外键的​​字段名称是ToolCheckIn,那么查询就是

stackoverflow

以上表示您使用模型ToolCheckIn.objects.all().filter(stackoverflow__ToolID__contains=p‌​k) 中的外键ToolID对模型Tool的{​​{1}}字段进行包含查询。

如果您对模型stackoverflow的说法字段ToolCheckIn进行了包含查询,那么您的查询将看起来像这样

Location

外键是外键或关系来自Tool的门,而双下划线是相同的路径。

我希望这能为你清除它。

虽然有趣的是要注意下面为什么以下没有工作

ToolCheckIn.objects.all().filter(stackoverflow__Location__contains=p‌​k)

即使是Docs也没有提供有关外键如何保存在表格中的任何信息。在存储之前是格式化还是哈希,以及为什么包含查询会出现model错误,或者Django是否支持包含查找外键直接,只支持相等查找,即假设外键始终为整数类型,因为外键是主键它来自哪个模型,默认情况下,如果你不提供任何主键,那么Django会自己生成主键哪个 int 类型。因此,当主键可以是 Char 类型的字段时,不会覆盖这种情况,这会带来包含查找的可能性包含不会在 int 类型上工作。

这就是我的想法,因为我在互联网上找不到相关的相关信息。