2016-09-14 69 views
0

我正在製作一個工具庫存/跟蹤系統。我目前的問題是,如何收集當前檢出的工具總數,然後從該工具的總數量中減去該數量。這樣我可以顯示手頭的數量。以便用戶可以確保該工具當前在商店中,並且不會被借用該工具的人檢出。django外鍵查詢彙總數據

型號:

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數據庫。

任何想法或想法,將不勝感激。

謝謝!

+0

我想你錯誤地寫了'Tool'而不是'ToolCheckIn'在你看過的**視圖**中,稍後你會提到查詢爲ToolCheckIn.objects.all()。是這樣嗎?因爲我可能會得到答案。 –

+0

Tool.objects.all用於檢索與搜索到的ToolID匹配的工具的所有數據。我還需要一個ToolTransaction對象,以便我可以爲每個ToolID添加ToolTransactions的數量,並從Tool中的每個ToolID的Total Quantity中減去它。然後,我可以從總量中減去ToolTransaction工具的數量,以告知用戶當前有多少工具。如果這是有道理的。讓我知道如果更多的澄清會有所幫助。 – furiousGeorge

+0

所有我問的是,當你在''tool = Tool.objects.all()行''tool_search'函數的stackoverflow中寫下你的這個問題時,你是否犯了一個**錯字**過濾器(ToolID__icontains = pk)'?它必須是** ToolCheckIn.objects.all()**而不是** Tool.objects.all()** ??這是我的疑問。 –

回答

0

將評論中的重要信息添加到答案中。

在你的情況適合包含查詢將

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

基本上,如果你ToolCheckIn模型外鍵的字段名會一直說stackoverflow,那麼查詢會一直

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

以上意味着您正在使用模型ToolCheckIn中的外鍵stackoverflowToolID型號Tool字段進行包含查詢。

如果你會作出包含發言權場查詢模型LocationTool然後將查詢看起來會是從這樣的事情

外鍵是那種一進門到model其中外鍵或關係來自於和雙下劃線是通向相同的路徑。

我希望這可以幫你清除它。

雖然需要注意的有趣的事情是,爲什麼下面沒有工作

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

即使文檔不提供關於外鍵是如何保存在表中的任何信息。無論是存儲,以便爲什麼包含之前格式化或散列查詢一聲Related Field got invalid lookup: icontains錯誤或Django的是否不支持包含外鍵查找直接,只支持平等查找即,假設外鍵始終是整數類型類型,因爲外鍵是主鍵從它來的模型,並且默認情況下,如果您不提供任何主鍵,然後Django使自己的主鍵其中int類型。因此,不覆蓋當主密鑰可以是字符類型,這與它帶來了的可能性的字段的情況下包含查找作爲包含不會在INT類型工作。

這就是我認爲的,因爲我沒有在互聯網上找到有關相同的信息。