Создание нескольких экземпляров из одной модели 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",
)])