首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中基于相关模型创建多个实例

在Django中基于相关模型创建多个实例
EN

Stack Overflow用户
提问于 2019-09-21 02:34:11
回答 1查看 31关注 0票数 0

在大学里,作为项目的一部分,我们必须用Django开发一个liga系统。我有我的基本应用程序运行,我的模型也已经设置好了。

代码语言:javascript
复制
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实例时,我希望调用下面的方法。该方法创建一定数量的玩家的所有游戏。每一场比赛都应该通过游戏模型存储在数据库中。

代码语言:javascript
复制
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的输出示例:

代码语言:javascript
复制
--------------------------
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']
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-21 05:34:17

您可以在liga使用post_save信号(https://docs.djangoproject.com/en/2.2/ref/signals/#post-save)创建后调用此函数:

代码语言:javascript
复制
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的文件来连接信号,这是导入过程的一个副作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58033610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档