Как уменьшить количество элемента в основной таблице, когда он используется в другой таблице - django - PullRequest
0 голосов
/ 06 марта 2019

Я создаю свою модель в Джанго, и у меня есть много-много отношений между расходными материалами и комплектами фургонов. Идея состоит в том, что «предмет» может принадлежать многим «комплектам фургонов», а «комплект фургонов» может иметь много »предметов. Я создал промежуточную модель, которая будет поддерживать отношения, но я изо всех сил пытаюсь найти способ связать количество в таблице комплекта фургона к количеству в таблице основных расходных материалов. Например, если бы я хотел пометить предмет в комплекте фургона как поврежденный и уменьшить количество этого запаса в комплекте фургона, я бы также хотел уменьшить общее количество этого запаса в основной таблице «расходных материалов» до его пополнения. Я думаю, что, возможно, мне придется создать функцию в моем файле представлений для выполнения этой логики, но я хотел знать, может ли это быть реализован в моей модели модели, чтобы свести к минимуму вероятность ошибки. Вот мой код:

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 голосов
/ 06 марта 2019

Один из вариантов - удалить / удалить поле quantity из вашей модели supplies и просто использовать запрос для получения общего количества.

Это будет немного дороже, так как запроспотребуется запускать каждый раз, когда вы хотите узнать число, но, с другой стороны, это упрощает ваш дизайн, поскольку вам не требуется никакой логики обновления для поля 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...