Django изменить администратор сохранить, чтобы изменить другое поле таблицы - PullRequest
0 голосов
/ 06 апреля 2020

Я создаю django сайт, который включает в себя элементарную систему инвентаризации. К ним относятся следующие модели

class Stock(models.Model):
    # Fields
    location = models.ForeignKey(Location)
    product = models.ForeignKey(Product)
    quantity = models.IntegerField()

class Transfer(models.Model):
    # Fields
    location1 = models.ForeignKey(Location, related_name='location1')
    location2 = models.ForeignKey(Location, related_name='location2')
    date_transferred = models.DateField(default=timezone.now)

class TransferLine(models.Model):
    # Choice set
    direction_set = (
        ('1TO2', 'From 1 to 2'),
        ('2TO1', 'From 2 to 1')
    )

    # Fields
    transfer = models.ForeignKey(Transfer, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField()
    transfer_direction = models.CharField(max_length=4, choices=direction_set, default='1TO2')

Когда я создаю новый перевод, я хочу иметь возможность автоматически вычитать и добавлять товар в TransferLine из количеств в модели Stock.

I Я выяснил, как переопределить метод save_model в файле admin.py для класса TransferAdmin, но я не могу понять, как получить доступ к модели Stock из класса SaleAdmin.

Можно ли это сделать в админке? Должен ли я создать свою собственную форму? Я действительно хотел сделать это из админа, потому что inlinetabular действительно легко сделать в админке по сравнению с пользовательской формой. (По крайней мере, из того, что я могу найти.)

Любая помощь по этому вопросу будет принята.

Чтобы прояснить ситуацию, допустим, что в моей базе данных есть следующие данные для Stock:

|id |loc_id|prod_id|qty|
|:-:|:----:|:-----:|:-:|
|1  |1     |1      |6  |
|1  |2     |1      |6  |

Затем я заполняю форму для транзакции, которая перенесет 3 продукта 1 из местоположения 1 в местоположение 2. Я хочу обновить таблицу Stock до следующей после сохранения формы транзакции.

|id |loc_id|prod_id|qty|
|:-:|:----:|:-----:|:-:|
|1  |1     |1      |3  |
|1  |2     |1      |9  |

Спасибо, Майкл

1 Ответ

0 голосов
/ 06 апреля 2020
class Transfer(models.Model):
    # Fields
    location1 = models.ForeignKey(Location, related_name='location1')
    location2 = models.ForeignKey(Location, related_name='location2')
    date_transferred = models.DateField(default=timezone.now)

    def save(self, *args, **kwargs):
        created = False
        if not self.id:
            created = True
        super().save(*args, **kwargs)
        if created:
            # will execute after the creation
            transfer_line = TransferLine.objects.create(transfer=self)  # self = created tranfer
...