Django在创建另一个对象时创建并保存许多模型实例

2024-10-01 15:43:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个国际象棋游戏,我想在新的ChessParty开始后用象棋图形(状态模型)初始化字段。
我读过关于重写save()模型方法的文章,但是我不知道如何在我的案例中使用它。
我正在阅读关于post_save之类的信号,但我也有同样的问题。在

像这样的事情能奏效吗?在

    def save(self, *args, **kwargs):
        (Here i want create many instances of another Model)
    super(ChessParty, self).save(*args, **kwargs)

到目前为止我的代码是:

^{pr2}$

Tags: 方法模型self图形游戏信号状态save
1条回答
网友
1楼 · 发布于 2024-10-01 15:43:32

使用save():

如果要使用save()方法,可以执行以下操作:

def save(self, *args, **kwargs):
    OtherModel.objects.create(something=kwargs['something'])
    YetAnotherModel.objects.create(
        something_else=kwargs['something_else']
    )
    super(ChessParty, self).save(*args, **kwargs)

正如@e4c5在他的评论中所说的那样,它更容易实现,这就是为什么我要包含它!在


我对这个问题的看法:

尽管您可以在save()上执行此操作,但我建议您改用signal。在

特别是使用^{}信号。以下是如何做到这一点:

  1. 创建文件your_app/signals.py

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    from your_app.models import ChessParty, OtherModel, YetAnotherModel
    
    
    @receiver(post_save, sender=ChessParty)
    def change_my_name_plz (sender, instance, created, **kwargs):
        if created:
            OtherModel.objects.create(something=kwargs['something'])
            YetAnotherModel.objects.create(
                something_else=kwargs['something_else']
            )
    
  2. 现在需要重写ready()上的ready()函数:

    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
  3. 最后,在your_app/__init__.py中添加以下内容:

    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    

现在有了一个信号,它将在创建新的ChessParty对象之后立即创建OtherModelYetAnotherModel对象。在


定义信号的另一种方法:

还有一种方法不使用@receiver修饰符,而是使用^{}方法:

  1. your_app/signals.py

    from your_app.models import ChessParty, OtherModel, YetAnotherModel
    
    
    def change_my_name_plz (sender, instance, created, **kwargs):
        if created:
            OtherModel.objects.create(something=kwargs['something'])
            YetAnotherModel.objects.create(
                something_else=kwargs['something_else']
            )
    
  2. your_app/app.py

    from django.apps import AppConfig
    from django.db.models.signals import post_save
    
    from your_app.models import ChessParty
    from your_project.your_app.signals import change_my_name_plz
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            post_save.connect(change_my_name_plz, sender=ChessParty)
    
  3. your_app/__init__.py与上面相同(步骤3)。


相关问题 更多 >

    热门问题