Django | Автоматическое создание объектов в модели

У меня есть две модели 'CardsDesk' и 'Card'.

Пример:

class CardsDesk(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название колоды', blank=True, null=True)
    image = models.ImageField(upload_to='media/',verbose_name='Картинка колоды')


class Card(models.Model):

    CHOICES = [
    ('Мечи', (
            ('Swords_1', 'Туз мечей'),
            ('Swords_2', 'Двойка мечей'),
            ('Swords_3', 'Тройка мечей'),
            ('Swords_4', 'Четверка мечей'),
            ('Swords_5', 'Пятерка мечей'),
            ('Swords_6', 'Шестерка мечей'),
            ('Swords_7', 'Семерка мечей'),
            ('Swords_8', 'Восьмерка мечей'),
            ('Swords_9', 'Девятка мечей'),
            ('Swords_10', 'Десятка мечей'),
            ('Swords_11', 'Паж мечей'),
            ('Swords_12', 'Рыцарь мечей'),
            ('Swords_13', 'Королева мечей'),
            ('Swords_14', 'Король мечей'),
        )
    ),
   ............

Мне нужно, чтобы при создании модели типа "CardDeck" Автоматически создавать 78 объектов с автоматически выбранными категориями.

Есть идеи?

Я пробовал цикл for, я пробовал def save create(). Пока что я совершенно не представляю, как это реализовать.

Сделайте это с помощью Django Signals.

Предполагая следующие модели в models.py:

CARD_TYPE_CHOICES = [
    ('Swords_1', 'Туз мечей'),
    ('Swords_2', 'Двойка мечей'),
    ('Swords_3', 'Тройка мечей'),
    ('Swords_4', 'Четверка мечей'),
    ('Swords_5', 'Пятерка мечей'),
]

class CardDeck(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название колоды', blank=True, null=True)
    image = models.ImageField(upload_to='media/',verbose_name='Картинка колоды')


class Card(models.Model):
    deck = models.ForeignKey(CardDeck, on_delete=models.CASCADE)
    card_type = models.CharField(default="Swords_1", choices=CARD_TYPE_CHOICES, max_length=32)

Создайте файл signals.py со следующим приемником для post_save события модели CardDeck:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import CardDeck, Card, CARD_TYPE_CHOICES
 
 
@receiver(post_save, sender=CardDeck)
def create_cards_for_deck(sender, instance, created, **kwargs):
    if created:
        cards = (Card(card_type=card_type[0], deck=instance) for card_type in CARD_TYPE_CHOICES)
        Card.objects.bulk_create(cards)

Наконец, привяжите сигналы к вашему файлу apps.py следующим образом:

from django.apps import AppConfig
 
class AppnameConfig(AppConfig):
    name = 'appname'
 
    def ready(self):
        import appname.signals

Читайте больше о методе bulk_create().

Вернуться на верх