Django save_form () вычисление со строками - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть такая настройка:

models.py

class BargainItem(models.Model):
    product = models.ForeignKey(Item)
    bargain = models.ForeignKey(Bargain)
    quantity = models.IntegerField()

class Bargain(models.Model):
    name = models.CharField(max_length=50, unique=True)
    discount_price = models.DecimalField(decimal_places=2)
    total_price = models.DecimalField(decimal_places=2, editable=False, default=Decimal(0))

class Item(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2)

admin.py

class BargainItemInline(admin.TabularInline):
    model = BargainItem
    extra = 1

class BargainAdmin(admin.ModelAdmin):
    model = Bargain
    # ...
    inlines = (BargainItemInline,)

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            if isinstance(instance, Bargain):
                # ...
                instance.save()

каким-то образом обновить total_price до объекта Bargain total_price = (instance.quantity * instance.product.price) - СКИДКА

Я пытаюсь обновить total_price для сделки после того, как bargainItems сохранены, но ДО записи в БД ... Я озадачен

Ответы [ 2 ]

0 голосов
/ 16 апреля 2011

Это работает на mysql, но на sqlite3 я получаю, что не существует, и его экземпляры возвращают пустой список ... ??

    def save_formset(self, request, form, formset, change):
      #instances = formset.save(commit=False)
      #bargain_id = 0
      total_price = Decimal(0)
      print("Formset: ", formset)
      instances = formset.save(commit=False)
      print("Instances: ", instances)
      bargain_id = 0

      for instance in iter(instances):
          if isinstance(instance, BargainProduct):
              total_price += instance.quantity * instance.product.price
              bargain_id = instance.id
          instance.save()
      updateTotal = Bargain.objects.get(id=bargain_id)
      updateTotal.total_price = total_price - updateTotal.discount_price
      updateTotal.save()
0 голосов
/ 15 апреля 2011

Я думаю, что в этом случае вам придется использовать пользовательский сигнал, который обновляет поле после сохранения сделки.Использование post_save для объекта Bargain не будет работать, потому что вы попадете в бесконечный цикл, если сохраните объект Bargain в сигнале post_save.

Переопределение метода save_model в BargainAdmin не будет работатьпотому что встроенные модели не будут сохранены до тех пор, пока не будет сохранена сделка.

Надеюсь, что вы попадете в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...