例如,我有一个名为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,提示“尚未加载模型”。所以我对做什么或如何前进感到困惑。
一如既往,我非常感谢所有答案!
答案 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
)来做到这一点。该信号将在用户模型的每个后续保存中运行。