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().