我正在制作工具清单/跟踪系统。我当前的问题是,如何收集当前已检出的工具的总数,并从该工具的总数量中减去该数量。这样我就可以显示手边的数量了。这样,用户就可以确保该工具目前在商店中,并且不会被借用它的人检出。
型号:
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")
我收到了这个错误:相关字段无效查找:图标,我删除了上面列出的导致错误的代码行: queryset = ToolCheckIn.objects.all().filter(ToolID_id__icontains=pk)
不确定我是否可以从ORM中实现这一点,或者我是否需要编写一些原始sql来实现这一点。我目前正在使用MYSQL。
如有任何想法或想法,将不胜感激。
谢谢!
发布于 2016-09-16 22:20:33
将注释中的重要信息添加到答案中。
在您的情况下,合适的包含查询将是
ToolCheckIn.objects.all().filter(ToolID__ToolID__contains=pk)
基本上,如果您的ToolCheckIn
模型中外键的字段名应该是stackoverflow
,那么查询应该是
ToolCheckIn.objects.all().filter(stackoverflow__ToolID__contains=pk)
上面的意思是使用模型ToolID
中的外键stackoverflow
对模型Tool
的stackoverflow
字段进行包含查询。
如果您在模型的Location
字段上做了一个包含的查询,那么您的查询应该是这样的
ToolCheckIn.objects.all().filter(stackoverflow__Location__contains=pk)
外键是通向外键或关系的model
的门,而双下划线是通向相同的路径。
我希望这能帮你清除掉。
但有趣的是,为什么下面这些东西不起作用?
ToolCheckIn.objects.all().filter(ToolID__contains=pk)
甚至Docs也没有提供任何关于外键如何保存在表中的信息。无论是在存储前格式化还是散列,以说明为什么包含查询会导致Related Field got invalid lookup: icontains
错误,或者Django是否直接支持外键上的包含查找,只支持等式查找,即假定外键始终是整数类型,因为外键是来自于外键的模型的E 126主键<Related Field got invalid lookup: icontains>E 227,默认情况下,如果不提供任何主键,则Django将生成自己的E 128主键E 229/code>其中的<>代码E 130E 231/>代码类型。因此,当主键可以是
Char
类型的字段时,不包括这种情况,这就带来了
包含
查找的可能性,因为
包含
不适用于
int
类型。
这就是我所想的,因为我没有在互联网上找到很多关于同样的相关信息。
https://stackoverflow.com/questions/39481905
复制