Вопрос:

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

python django database sqlite django-models

7 просмотра

1 ответ

6 Репутация автора

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

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» для работы с соединительной таблицей, но я боюсь, что я могу использовать ее неправильно. Заранее спасибо.

Автор: Tank12 Источник Размещён: 06.03.2019 04:01

Ответы (1)


0 плюса

6326 Репутация автора

Один из вариантов - удалить / удалить поле 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']
Автор: Ralf Размещён: 06.03.2019 06:13
Вопросы из категории :
32x32