在大学里,作为项目的一部分,我们必须用Django开发一个liga系统。我有我的基本应用程序运行,我的模型也已经设置好了。
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)现在,当我在管理区域创建了一个新的liga时,我想让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']发布于 2019-09-21 05:34:17
您可以在liga使用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 ready函数中的模型定义之后是很常见的,通常在ready函数中导入一个名为signals.py的文件来连接信号,这是导入过程的一个副作用。
https://stackoverflow.com/questions/58033610
复制相似问题