Создайте несколько экземпляров из связанной модели в Django - PullRequest
0 голосов
/ 20 сентября 2019

В университете в рамках проекта мы должны разработать систему лиг с Django.У меня запущено основное приложение, а также уже настроены мои модели.

from django.db import models
from datetime import datetime

# Create your models here.
class Player(models.Model):
    vorname         = models.CharField(max_length=30)
    nachname        = models.CharField(max_length=50)
    created_on      = models.DateTimeField(auto_now_add=True)
    email           = models.EmailField()


class Liga(models.Model):
    name            = models.CharField(max_length=50)
    participants    = models.ManyToManyField(Player)
    created_on      = models.DateTimeField(auto_now_add=True)
    is_active       = models.BooleanField(default=False)
    is_completed    = models.BooleanField(default=False)

class Game(models.Model):
    liga            = models.ForeignKey(Liga, on_delete='DO NOTHING')
    player1         = models.CharField(max_length=100)
    player2         = models.CharField(max_length=100)
    score_pl1       = models.IntegerField(blank=True)
    score_pl2       = models.IntegerField(blank=True)
    is_completed    = models.BooleanField(default=False)
    completed_on    = models.DateTimeField(auto_now_add=True)

Теперь, когда я создал новую лигу в административной области, я хочу, чтобы Django автоматически создал экземпляры Game (которые могут бытьнесколько).Я пробовал несколько разных способов сделать это, но не смог решить эту проблему.Когда я создаю экземпляр Liga, я хочу, чтобы метод ниже был вызван.Метод создает все игры с определенным количеством игроков.Каждая игра должна делать ставки, хранящиеся в базе данных, используя модель игры.

player = ['Max', 'Sebastian', 'Tim', 'Bernd', 'Klaas', 'Kyle', 'Andreas', 'Jürgen']

def create_games(players):

    n = len(players)
    for i in range(0,n):
        print('--------------------------')
        print('Gameday ' + str(i+1))
        print('--------------------------')

        if i == len(players)-1:
            game = [players[i], players[0]]
        else:
            game = [players[i], players[n-1]]
        print(game)
        for k in range(1, n//2):
            game = [players[(i+k) % (n-1)], players[(i-k)%(n-1)]]
            print(game)
        print(' ')



liga1 = create_games(player)

Пример вывода create_games:

--------------------------
Gameday 1
--------------------------
['Max', 'Jürgen']
['Sebastian', 'Andreas']
['Tim', 'Kyle']
['Bernd', 'Klaas']

--------------------------
Gameday 2
--------------------------
['Sebastian', 'Jürgen']
['Tim', 'Max']
['Bernd', 'Andreas']
['Klaas', 'Kyle']

--------------------------
Gameday 3
--------------------------
['Tim', 'Jürgen']
['Bernd', 'Sebastian']
['Klaas', 'Max']
['Kyle', 'Andreas']

--------------------------
Gameday 4
--------------------------
['Bernd', 'Jürgen']
['Klaas', 'Tim']
['Kyle', 'Sebastian']
['Andreas', 'Max']

--------------------------
Gameday 5
--------------------------
['Klaas', 'Jürgen']
['Kyle', 'Bernd']
['Andreas', 'Tim']
['Max', 'Sebastian']

--------------------------
Gameday 6
--------------------------
['Kyle', 'Jürgen']
['Andreas', 'Klaas']
['Max', 'Bernd']
['Sebastian', 'Tim']

--------------------------
Gameday 7
--------------------------
['Andreas', 'Jürgen']
['Max', 'Kyle']
['Sebastian', 'Klaas']
['Tim', 'Bernd']

--------------------------
Gameday 8
--------------------------
['Jürgen', 'Max']
['Sebastian', 'Andreas']
['Tim', 'Kyle']
['Bernd', 'Klaas']

1 Ответ

0 голосов
/ 21 сентября 2019

Эту функцию можно вызвать после того, как лига будет упакована с использованием сигнала post_save (https://docs.djangoproject.com/en/2.2/ref/signals/#post-save):

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Liga)
def my_callback(sender, **kwargs):
    the_liga_created = kwargs.get('instance')
    print("Do whatever you want here; like calling create_games")

Обычно такой код помещают после определения модели в models.py или в функцию готовности app_config,часто файл с именем signal.py просто импортируется в функцию готовности для подключения сигналов в качестве побочного эффекта импорта ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...