автоматически создавать объект модели, когда объект другой таблицы создается или обновляется в моделях django - PullRequest
0 голосов
/ 08 мая 2018

У меня есть две модели в Django, и я хочу автоматически создать объект History при создании или обновлении объекта Food и установить атрибут food_price для History в атрибут price для созданный Food объект. Моя цель - иметь историю изменения цены еды. Как мне этого добиться?

Мой models.py:

class Food(models.Model):
    food_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30, null=False, blank=False)
    desc = models.TextField(max_length=200)
    price = models.IntegerField(null=False, blank=False)
    f_thumbnail = models.ImageField(upload_to=get_food_t_image_name)
    DDD_data = models.ImageField(upload_to=get_food_d_image_name)
    availability = models.BooleanField(default=True)
    discount = models.IntegerField(default=0)

    def __str__(self):
        return '%s %s %s' % (self.name, self.category_id, self.price)

class History(models.Model):
    id = models.AutoField(primary_key=True)
    food_id = models.IntegerField()
    food_price = models.IntegerField()
    history_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s %s %s' % (self.id, self.food_id.name, self.food_id.price)

Заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

Я думаю, у вас есть два пути.

Сначала используйте __save__() метод в модели.

В модели django (models.Model) есть метод __save__. Когда объект модели сохраняется, вы можете сделать дополнительную функцию, которая наследует этот метод.

Для получения дополнительной информации, пожалуйста, проверьте Официальные документы Сохранить ()

Во-вторых, используйте signals

Django поддерживает множество сигналов, включая django.db.models.signals. Включает в себя pre_save, post_save и т. Д. Таким образом, до (после) сохранения объекта модели вы можете выполнить команду sth в signals.

Пожалуйста, проверьте официальные документы документов

Я думаю, __save__() метод больше подходит для вашей цели. Так твой код будет ...

class Food(models.Model):
    food_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30, null=False, blank=False)
    desc = models.TextField(max_length=200)
    price = models.IntegerField(null=False, blank=False)
    f_thumbnail = models.ImageField(upload_to=get_food_t_image_name)
    DDD_data = models.ImageField(upload_to=get_food_d_image_name)
    availability = models.BooleanField(default=True)
    discount = models.IntegerField(default=0)

    def __str__(self):
        return '%s %s %s' % (self.name, self.category_id, self.price)

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        # you can add this for only existing model object
        if self.pk:
            # You can check if only 'price' field changed
            _original_food = Food.objects.get(id=self.pk)
            if _original_food.price != self.price:
                # do somthing here like saving history...
                History.objects.create(food_id=self.id, food_price=self.price)
                super(Food, self).save(force_insert, force_update, *args, **kwargs)
        super(Food, self).save(force_insert, force_update, *args, **kwargs)

Это всего лишь пример. Вы можете добавить и изменить свой код. Я надеюсь, что это поможет вам.

...