在Django中添加另一个模型对象后,如何自动创建一个模型的模型对象

时间:2019-12-04 18:05:07

标签: python django django-models

例如,我有一个名为Player的模型。我希望在Django中(从django.contrib.auth.models.User添加新用户时创建Player的Model对象,以便User模型中的每个User对象在Player模型中都有自己的对象。我知道从技术上讲,我将必须使用models.ForeignKey()在Player模型中创建一个字段并将其与User模型相关联,并且如果我使用on_delete=models.CASCADE,我不必担心会删除用户models.ForeignKey()中的参数,但如何使用默认值等自动创建这些对象。 最初,这是我这样做的代码:

for name in User.objects.all().values_list('username', flat=True):
if name not in Player.objects.all().values_list('player_name', flat=True):
    new_player = Player(player_name=name, current_level_no=None, no_of_moves=None)
    new_player.save()
else:
    pass

但是这会给我一个DatabaseIntegrityError,提示“尚未加载模型”。所以我对做什么或如何前进感到困惑。

一如既往,我非常感谢所有答案!

1 个答案:

答案 0 :(得分:2)

检出Django signals,特别是post_save signal。本质上,Django允许您定义一个函数,该函数将在保存用户模型时立即运行。您将使用类似以下的方式:

from django.db.models.signals import post_save

def create_player(sender, instance, created, **kwargs):
    if created:
        Player.objects.create(user=instance)  # instance is the User object

post_save.connect(create_player, sender=User)

请注意,如果您的数据库中已经有User对象,则不会为它们创建Player对象。您将需要通过运行与您在Django shell中发布的循环类似的循环(使用python manage.py shell)来做到这一点。该信号将在用户模型的每个后续保存中运行。