簡體   English   中英

在另一個表中使用項目時如何減少主表中項目的數量-Django

[英]How to reduce quantity of an item in main table when it is being used in another table - django

我正在Django中創建模型,並且耗材和貨車套件之間存在多對多關系。 我的想法是,一個“項目”可以屬於許多“ van kit”,而一個“ van kit”可以具有許多“項目”。我創建了一個可以保持這種關系的中介模型,但是我在努力尋找一種關聯的方法貨車套件表中的數量與主要耗材表中的數量。例如,如果我想將貨車套件中的某件商品標記為損壞,並減少貨車套件中該供應品的數量,我也想減少“補給”主表中的補給總數,直到被補給為止。我認為也許我必須在視圖文件中創建一個函數來執行該邏輯,但我想知道是否可以而是在我的模型設計中實施,以最大程度地減少出錯的機會。這是我的代碼:

class supplies(models.Model):
    class Meta:
        verbose_name_plural = "supplies"
    # limit the user to selecting a pre-set category
    choices = (
        ('CREW-GEAR','CREW-GEAR'),
        ('CONSUMABLE','CONSUMABLE'),
        ('BACK-COUNTRY','BACK-COUNTRY')
        )
    supplyName = models.CharField(max_length=30, blank=False) # if they go over the max length, we'll get a 500 error
    category = models.CharField(max_length=20, choices = choices, blank=False)
    quantity = models.PositiveSmallIntegerField(blank=False) # set up default
    price = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True) # inputting price is optional
    def __str__(self):
        return self.supplyName

class van_kit(models.Model):
    supply_name = models.ManyToManyField(supplies, through='KitSupplies',through_fields=('vanKit','supplyName'), related_name="supplies")
    van_kit_name = models.CharField(max_length=100)
    vanName = models.ForeignKey(vans, on_delete=models.CASCADE)
    def __str__(self):
        return self.van_kit_name


class KitSupplies(models.Model):
    supplyName = models.ForeignKey(supplies, on_delete=models.CASCADE)
    vanKit = models.ForeignKey(van_kit, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(blank=False)
    def __str__(self):
        return str(self.supplyName)
    class Meta:
        verbose_name_plural = 'Kit Supplies'

我對django相當陌生,我必須在一個班級項目中學習它,因此,如果我的邏輯有缺陷或有明顯的更好方法,請敬請告知我。 我願意嘗試新的方法。 另外,我已經閱讀了有關使用“ through”和“ through_fields”與聯結表一起使用的文檔,但是擔心我可能未正確使用它。 提前致謝。

一種選擇是從supplies模型中刪除/刪除字段quantity ,而僅使用查詢來獲取總數量。

這會貴一些,因為每次您想知道該編號時都需要運行查詢,但是另一方面,由於不需要字段supplies.quantity任何更新邏輯,因此可以簡化您的設計。

查詢看起來可能像這樣簡單:

>>> from django.db.models import Sum
>>> supplies_instance.kitsupplies_set.aggregate(Sum('quantity'))
{'quantity__sum': 1234}

您甚至可以將其設置為模型的屬性,以便於訪問:

class supplies(models.Model):
    ...

    @property
    def quantity(self):
        data = self.kitsupplies_set.aggregate(Sum('quantity'))
        return data['quantity__sum']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM