Как уменьшать количество в запасе посредством одного inlineform_set?

Идея состоит в том, чтобы с формуляра продаж он добавил продукты, которые были должны продавать факт с одним inlineform_set и в момент сохранения, у меня остались продукты запаса, который в моем случае является моделью Product.

Это мои модели:

class Sale(models.Model):

    n_sale        = models.CharField(max_length=10,blank=True)
    customer      = models.ForeignKey(User)

class SaleDetail(models.Model):

    relationship  = models.ForeignKey(Sale)
    products      = models.ForeignKey('products.Products')
    quantity      = models.DecimalField(max_digits=100,decimal_places=2)
    price         = models.DecimalField(max_digits=10,decimal_places=2)
    total         = models.DecimalField(max_digits=10,decimal_places=2)

class Products(models.Model):

    products    = models.CharField(max_length=100)
    quantity    = models.DecimalField(max_digits=100,default='0',decimal_places=2)
    description = models.TextField(max_length=250)
6
задан 09.03.2016, 21:40
3 ответа

Ты мог бы использовать signals, ты объявляешь в моделях функцию restar_stock и после имеешь значение:

 from django.db.models.signals import pre_save, post_save

и выполни функцию после того, как сохраняет продажу автоматически, немного похоже на triggers в базе данных, ты можешь проверять больше информации signals в официальной документации: https://docs.djangoproject.com / он / 1.9 / topics / signals/.

2
ответ дан 24.11.2019, 14:45

Я предполагаю, что в какой-то стороне в твоем виде ты считаешь что-то этим, чтобы санкционировать как продажу, так и Вашу деталь (принимая, что формуляры назвались form и formset соответственно):

if form.is_valid() and formset.is_valid():
    sale = form.save()
    sale_details = formset.save()
    # ...

После того, как сохранял бы детали ты мог бы повторять каждую инстанцию, чтобы обновлять запас твоего продукта. Немного как это:

if form.is_valid() and formset.is_valid():
    sale = form.save()
    sale_details = formset.save()
    for sale_detail in sale_details:
        products = sale_detail.products
        products.quantity -= sale_detail.quantity
        products.save()

Другой выбор - sobreescribir метод save твоей модели SaleDetail для того, чтобы каждый раз, когда сохраняли инстанцию стал отвечающим совремнным требованиям также запас продукта, связанного с этой деталью.

В действительности, он не становится отвечающим современным требованиям посредством inlineform_set как предложи титул твоего вопроса, просто делается дополнительная работа после того, как сохраняет инстанции с inlineform_set.

1
ответ дан 24.11.2019, 14:45

Это resolvГ - в острие queryset:

def get_success_url(self):
    id_products_sale = SaleDetail.objects.filter(relationship_id=self.object.pk)
    for x in id_products_sale:
        cant_products = Products.objects.filter(id=x.products_id)
        for z in cant_products:
            total = z.quantity - x.quantity
            update = Products.objects.values('quantity').filter(id=x.products_id).update(quantity=total)
    return reverse('detail_sale', kwargs={'pk': self.object.pk})
1
ответ дан 24.11.2019, 14:45
  • 1
    +1 из-за того, что автоотвечает:) – astrojuanlu 12.07.2016, 18:14