Использовать данные в модели внешнего ключа перед сохранением в администраторе Django - PullRequest
0 голосов
/ 27 января 2019

Я создаю прототип приложения оценки.

Каждая модель оценки будет иметь одну или несколько моделей деталей.

Вот начало моих моделей:

class Part(models.Model):
    estimate = models.ForeignKey('Estimate', on_delete=models.CASCADE)
    description = models.CharField(max_length=255)


class Estimate(models.Model):
    number = models.CharField(max_length=255, primary_key=True)
    customer = models.CharField(max_length=255, null=True, blank=True)
    description = models.CharField(max_length=255, null=True, blank=True)
    price = models.IntegerField(null=True, blank=True)
    stitch = models.BooleanField(null=True, blank=True)
    stitch_speed = models.IntegerField(null=True, blank=True)
    stitch_rate = models.IntegerField(null=True, blank=True)
    boxes = models.IntegerField(null=True, blank=True)
    freight = models.IntegerField(null=True, blank=True)
    overall_markup = models.IntegerField(null=True, blank=True)
    date_created = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.number

У меня есть модель оценки, появляющаяся в админке с моделями деталей в StackedInline.

class PartInline(admin.StackedInline):
    model = Part
    extra = 1


class EstimateAdmin(admin.ModelAdmin):
    model = Estimate
    inlines = [PartInline]
    list_display = ['number', 'description', 'customer', 'price']

В идеале, я бы пошел в администратор, создал новую оценку, заполнил ее детали и затем щелкнул Сохранить.

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

У меня возникают трудности с выяснением способа отправки данных из модели Части в модель Оценки до сохранения.

Какие-либо предложения?Существует ли стандартный способ передачи данных между моделями перед сохранением?

1 Ответ

0 голосов
/ 27 января 2019

Из того, что я понял, вы можете использовать сигнал pre_save , где вы можете получить все детали, связанные с вашим экземпляром Estimate.Что-то вроде:

from django.dispatch import receiver
from django.db.models.signals import pre_save
from somewhere import Estimate

@receiver(pre_save, sender=Estimate)
def pre_save_handler(sender, instance, **kwargs):
    # instance is your Estimate object that you currently save
    # you can get all part objects with:
    parts = instance.part_set.all() # a QuerySet list with your parts
    for part in parts:
        # do something with each part

РЕДАКТИРОВАТЬ : чтобы получить все детали, используя функцию _set, вам необходимо изменить логику, чтобы Part экземпляры сохранялись до Estimate путем переопределенияEstimateAdmin save_formset функция:

class EstimateAdmin(admin.ModelAdmin):
    ....
    def save_formset(self, request, form, formset, change):
        formset.save() # this saves your parts
        form.instance.save() # this saves the Estimate
...