在另一个表中使用项目时如何减少主表中项目的数量-Django

时间:2019-03-06 16:01:20

标签: python django database sqlite django-models

我正在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”与联结表一起使用的文档,但是担心我可能未正确使用它。预先感谢。

1 个答案:

答案 0 :(得分:0)

一种选择是从quantity模型中删除/删除字段supplies,而仅使用查询来获取总量。

这会贵一些,因为每次您想知道该数字时都需要运行查询,但是另一方面,由于不需要为字段{提供任何更新逻辑,因此它简化了设计{1}}。

查询看起来像这样简单:

supplies.quantity

您甚至可以将其设置为模型的属性,以便于访问:

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