Добавить регистрацию при создании django - PullRequest
1 голос
/ 27 февраля 2020

Итак, я пытаюсь создать RESTFULL для приложения на django. Так что никаких просмотров не требуется, сейчас я добавляю это в админку. Я создал 2 модели таблицы 1 и категории. Каждый раз, когда я добавляю строку таблицы 1, мне нужно вставлять 4 категории и бюджет для каждой, начиная с 0. Я пробовал использовать метод внутри класса таблицы 1, переопределяющий метод сохранения. и вставить, когда он вставлен, но я получил ошибку, потому что ссылочная целостность. У меня есть несколько вопросов. 1.- Каков наилучший способ сделать это? Я видел событие on_insert, но я также читал, что не рекомендуется работать с этим. 2. Переопределите метод сохранения, оставив пустую ссылку на таблицу1? а потом обновить с последней вставкой? 3.- другой вариант?

class table1(models.Model):
    table1field = models.CharField(max_length=100,default='')
    def  add_cat(self,cat):
        category.objects.create(descripcion_categoria_insumo='category 1', category=cat, budget=0)
        category.save()
        category.objects.create(descripcion_categoria_insumo='category 2', category=cat,budget=0)
        CategoriaInsumo.save()

        pass
    def save(self, *args, **kwargs):
        created = self.pk is None
        super(table1,self).save(*args, **kwargs)  # Call the "real" save() method.
        self.add_cat(self.pk)


class category(models.Model):
    desc_category =models.CharField(max_length=100,default='')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    budget= models.DecimalField(default=0,max_digits=12,decimal_places=2 ,blank=True)

    category = models.ForeignKey(table1, on_delete=models.CASCADE,blank=True)
    def __str__(self):
        return self.desc_category


1 Ответ

1 голос
/ 27 февраля 2020

Вы можете использовать сигнал post_save от django. С помощью сигналов вы можете настроить функцию для выполнения каждый раз, когда происходит какое-либо событие (здесь событие добавляет новую запись в table1).

Таким образом, вы можете создать функцию, которая вызывается каждый раз, когда создается объект table1:

from .models import table1, category
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=table1)
def save_profile(sender, instance, **kwargs):
    # create the categories
    category.objects.create(descripcion_categoria_insumo='category 1',
        category=cat, budget=0)
    .
    .
    .

instance - это вновь созданная запись в таблице 1.

Обычно этот файл находится по адресу singals.py, и django не загружает его по умолчанию, поэтому вам нужно отредактировать файл apps.py с помощью :

class YouAppConfig(AppConfig):
    .
    .
    .
    def ready():
        import .signals
...