Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django在创建另一个对象时创建并保存模型的多个实例_Python_Django - Fatal编程技术网

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

Python Django在创建另一个对象时创建并保存模型的多个实例,python,django,Python,Django,我正在设计一个国际象棋游戏,我想在新的棋队开始后用国际象棋数字(状态模型)初始化字段 我读过关于重写save()model方法的内容,但我不知道如何在我的案例中使用它 我读到了一些信号,比如post\u save,但我也有同样的问题 像这样的东西可以用吗 def save(self, *args, **kwargs): (Here i want create many instances of another Model) super(ChessParty, se

我正在设计一个国际象棋游戏,我想在新的
棋队开始后用国际象棋数字(状态模型)初始化字段
我读过关于重写
save()
model方法的内容,但我不知道如何在我的案例中使用它
我读到了一些信号,比如
post\u save
,但我也有同样的问题

像这样的东西可以用吗

    def save(self, *args, **kwargs):
        (Here i want create many instances of another Model)
    super(ChessParty, self).save(*args, **kwargs)
这是我到目前为止的代码:

class ChessParty(models.Model):
    chessparty_id = models.AutoField("ID partii", primary_key=True)
    arbiter = models.ForeignKey(Arbiter, related_name='sedzia', 
    verbose_name="Sędzia")
    white = models.ForeignKey(Player, related_name='Białe', 
    verbose_name="Białe figury")
    black = models.ForeignKey(Player, related_name='Czarne', 
    verbose_name="Czarne figury")
    tournament = models.ForeignKey(Tournament, verbose_name="Nazwa turnieju")

    def __str__(self):
        return "{white} vs {black}, ({tournament})"\
            .format(black=self.black, white=self.white, tournament=self.tournament)


class OneMove(models.Model):
party = models.ForeignKey(ChessParty, default='0', verbose_name="Partia")
chessman = (
    ('a1_w_rook', 'biała wieża a1'), ('h1_w_rook', 'biała wieża h1'),
    ('b1_w_knight', 'biały skoczek b1'), ('g1_w_knight', 'biały skoczek g1'),
    ('c1_w_bishop', 'biały goniec c1'), ('f1_w_bishop', 'biały goniec f1'),
    ('d1_w_queen', 'biały hetman d1'), ('e1_w_king', 'biały król e1'),
    ('a2_w_pawn', 'biały pion a2'), ('b2_w_pawn', 'biały pion b2'),
    ('c2_w_pawn', 'biały pion c2'), ('d2_w_pawn', 'biały pion d2'),
    ('e2_w_pawn', 'biały pion e2'), ('f2_w_pawn', 'biały pion f2'),
    ('g2_w_pawn', 'biały pion g2'), ('h2_w_pawn', 'biały pion h2'),
    ('a8_b_rook', 'czarna wieża a1'), ('h8_b_rook', 'czarna wieża h8'),
    ('b8_b_knight', 'czarny skoczek b1'), ('g8_b_knight', 'czarny skoczek g8'),
    ('c8_b_knight', 'czarny goniec c1'), ('f8_b_bishop', 'czarny goniec f8'),
    ('d8_b_queen', 'czarny hetman d1'), ('e8_b_king', 'czarny król e8'),
    ('a7_b_pawn', 'czarny pion a7'), ('b7_b_pawn', 'czarny pion b7'),
    ('c7_b_pawn', 'czarny pion c7'), ('d7_b_pawn', 'czarny pion d7'),
    ('e7_b_pawn', 'czarny pion e7'), ('f7_b_pawn', 'czarny pion f7'),
    ('g7_b_pawn', 'czarny pion g7'), ('h7_b_pawn', 'czarny pion h7'),
 )
chessman = models.CharField(max_length=30, choices=chessman, default='pionek', verbose_name="Figura Szachowa")
mymove = []
for a, b in itertools.product('abcdefgh', '12345678'):
    name = a + b
    mymove.append((name, name))
mytuple = tuple(mymove)
move = models.CharField(max_length=2, choices=mytuple, default='a1', verbose_name="Ruch na")

class Meta:
    abstract = True


class State(OneMove):
state_id = models.PositiveIntegerField(default=0, verbose_name="numer ruchu")
is_capture = models.BooleanField(default=False, verbose_name="Czy zbita")
capture_choice = (
    ('true', 'zbity'),
    ('false', 'nie zbity'),
)
is_capture = models.CharField(max_length=9, choices=capture_choice, default='false', verbose_name="Czy zbity")
使用
保存()

如果要使用
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()
上执行此操作,但我建议您使用一个

具体使用一个信号。以下是如何做到这一点:

  • 创建一个文件
    你的应用程序/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']
            )
    
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    
    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']
            )
    
    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)
    
  • 您现在需要覆盖您的应用程序/app.py上的
    ready()
    函数:

    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']
            )
    
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    
    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']
            )
    
    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)
    
  • 最后,在您的应用程序中添加以下内容:

    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']
            )
    
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    
    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']
            )
    
    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)
    
  • 现在,在创建新的
    棋队
    对象之后,有一个信号将创建一个
    OtherModel
    YetAnotherModel
    对象


    定义信号的替代方法:

    还有一种替代方法不使用
    @receiver
    装饰器,而是使用以下方法:

  • 你的应用程序/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']
            )
    
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    
    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']
            )
    
    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)
    
  • 你的应用程序/app.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']
            )
    
    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'your_project.your_app'
    
        def ready(self):
            import your_project.your_app.signals
    
    default_app_config = 'your_project.your_app.apps.YourAppConfig'
    
    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']
            )
    
    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)
    
  • 您的应用程序/\uuuuu init\uuuuuuupy
    与上述步骤相同(步骤3)



  • 使用信号在这里没有任何特殊优势<代码>保存
    同样可以很好地(或很差地)完成这项工作,但保存的优点是操作更简单implement@e4c5这是真的,我编辑了我的答案以包含
    save()
    方法,尽管OP最简单的解决方案是修改
    save()
    在任何地方都提到信号总是很好的,因为有时我们不控制应该触发另一个模型创建的模型:)+1我不明白django与国际象棋有什么关系?或者你是在为国际象棋网站设计一个人机界面?@e4c5这应该是管理国际象棋比赛的平台,裁判做出动作,维沃斯观看。这是一个使用数据库的大学项目。