Создание нескольких экземпляров из одной модели Django

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

from datetime import datetime, timedelta
import django
from django.conf import settings
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver


class BudgetTransaction(models.Model):
    """
    Individual transaction for Budget
    """

    transaction_types = [
        ('FI', 'Fixed Income'),
        ('FE', 'Fixed Expenses'),
        ('EC', 'Extra Cashflow'),
    ]

    frequencies = [
        ('one', 'one off'),
        ('wk', 'weekly'),
        ('fort', 'fortnightly'),
        ('mon', 'monthly'),
        ('yr', 'yearly'),
        ('day', 'specific day'),
    ]
    today = datetime.today().strftime('%Y-%m-%d')

    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        help_text="Owner of the item"
    )
    transaction_type = models.CharField(max_length=40, choices=transaction_types, default=1)
    transaction_name = models.CharField(max_length=100, null=False)
    transaction_amount = models.IntegerField(null=False)
    next_date = models.DateField(null=False, default=today)
    frequency = models.CharField(max_length=20, choices=frequencies, default=1)
    complete = models.BooleanField(default=False)

    def __str__(self):
        return self.transaction_name

    class Meta:
        ordering = ['next_date']


@receiver(post_save, sender=BudgetTransaction)
def create_forecasted(sender, instance, created, **kwargs):
    if created:
        today = datetime.today()
        this_month = today.month
        months_left = 12 - this_month

        if sender.frequency == "mon":
            BudgetTransaction.objects.create(owner=instance.owner)

Спасибо,

Митчелл

Я предлагаю создать файл под названием signals.py в приложении рядом с models.py и поместить туда все ваши сигналы, как более чистую структуру, я имею в виду.

Декоратор @receiver прослушивает запросы, сделанные к серверу. Если вы сделаете viewset для этой модели с конечной точкой для создания модели BudgetTransaction. приемник будет работать отлично. Но если это делается из django admin, я думаю, что приемник не будет работать так, как вы упомянули.

Я думаю, что это может сработать здесь вместо @receiver. post_save.connect() как здесь https://docs.djangoproject.com/en/4.0/ref/signals/

Я решил эту проблему, используя bulk_create, а не просто create. Я привел пример ниже, чтобы проиллюстрировать мое изменение. Он правильно получал запрос в моем первоначальном сообщении, но код просто не работал правильно после его получения. Я могу ошибаться и надеюсь, что кто-нибудь поправит меня, если это не так, но изначально я получал рекурсивную ошибку при использовании create(), которая, как я полагаю, возникала из-за того, что каждый раз, когда она выполнялась, она повторно посылала сигнал для создания другого элемента.

BudgetTransaction.objects.bulk_create([BudgetTransaction(
                owner=instance.owner,
                transaction_amount=1000,
                transaction_name=instance.transaction_name,
                transaction_type=instance.transaction_type,
                next_date="2022-08-08",
            )])
Вернуться на верх