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

2024-09-29 19:13:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django创建我的模型,我在供应品和货车套件之间有一个多对多的关系。这个想法是一个“物品”可以属于许多“货车套件”,而一个“货车套件”可以有许多“物品”。我创建了一个中介模型来保持这种关系,但是我很难找到一种方法来将van kit表中的数量与main supplies表中的数量联系起来。例如,如果我想将货车工具箱中的一个项目标记为损坏,并减少货车工具箱中该供应的数量,我还想减少主“供应”表中该供应的总计数,直到它被补充。我在想,也许我必须在我的视图文件中创建一个函数来实现这个逻辑,但是我想知道是否可以在我的模型设计中实现它,从而最小化出错的可能性。这是我的密码:

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”来处理连接表的文档,但是我担心我可能没有正确地使用它。提前谢谢


Tags: nameselffalsemodelsvanlengthmaxkit
1条回答
网友
1楼 · 发布于 2024-09-29 19:13:01

一种方法是从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']

相关问题 更多 >

    热门问题