Python 如何在django中添加另一个模型的模型对象时自动创建一个模型的模型对象

Python 如何在django中添加另一个模型的模型对象时自动创建一个模型的模型对象,python,django,django-models,Python,Django,Django Models,比如说,我有一个名为Player的模型。我希望在django中添加新用户时(从django.contrib.auth.models.User)创建播放器的模型对象,以便用户模型中的每个用户对象在播放器模型中都有自己的对象。我知道,从技术上讲,我必须使用models.ForeignKey()在播放器模型中创建一个字段并将其与用户模型关联,如果我使用on\u delete=models.CASCADEmodels.ForeignKey()中的参数,我就不必担心删除用户但是我如何自动创建这些具有类似默

比如说,我有一个名为Player的模型。我希望在django中添加新用户时(从
django.contrib.auth.models.User
)创建播放器的模型对象,以便用户模型中的每个用户对象在播放器模型中都有自己的对象。我知道,从技术上讲,我必须使用
models.ForeignKey()
在播放器模型中创建一个字段并将其与用户模型关联,如果我使用
on\u 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,“模型还没有加载”。因此,我对该做什么或如何前进感到困惑

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

请查看,特别是。本质上,Django允许您定义一个函数,该函数将在保存用户模型时运行。你可以这样使用它:

从django.db.models.signals导入后保存
def create_播放器(发送方、实例、已创建、**kwargs):
如果创建:
Player.objects.create(user=instance)#instance是用户对象
post\u save.connect(创建\u播放器,发送者=用户)
请注意,如果数据库中已有用户对象,则不会为其创建播放器对象;您需要运行一个类似于您在Django shell中发布的循环(使用
python manage.py shell
)来实现这一点。该信号将在用户模型的每次后续保存时运行。

签出,特别是。本质上,Django允许您定义一个函数,该函数将在保存用户模型时运行。你可以这样使用它:

从django.db.models.signals导入后保存
def create_播放器(发送方、实例、已创建、**kwargs):
如果创建:
Player.objects.create(user=instance)#instance是用户对象
post\u save.connect(创建\u播放器,发送者=用户)

请注意,如果数据库中已有用户对象,则不会为其创建播放器对象;您需要运行一个类似于您在Django shell中发布的循环(使用
python manage.py shell
)来实现这一点。该信号将在用户模型的每次后续保存时运行。

如果要在创建
用户
对象时自动创建
播放器
的对象,则应使用信号;但是错误完全是由于其他原因造成的(您可能在一个独立文件中运行此代码,这就是原因)。@PedramParsian您能进一步解释为什么会发生此错误,以便我知道将来要做什么吗?检查。好的,我会的,谢谢!如果要在创建
User
对象时自动创建
Player
对象,则应使用信号;但是错误完全是由于其他原因造成的(您可能在一个独立文件中运行此代码,这就是原因)。@PedramParsian您能进一步解释为什么会发生此错误,以便我知道将来要做什么吗?检查。好的,我会的,谢谢!好的,当我在谷歌上寻找一个解决方案时,我确实遇到了一些信号,但我真的不确定使用它是否正确,或者如何使用它,所以谢谢你。但是你回答的第二部分让我有点困惑,你说在python manage.py shell中运行一个循环,但是每次在创建播放器模型对象之前出现用户存在的情况时,我都必须运行这样一个循环。出于好奇和稳健性,有没有一种直观的方法来自动化这个过程?我不知道你的意思。您只需精确地运行此循环一次,就可以为在向代码中添加信号处理程序之前存在的任何用户创建播放器对象(如果这是一个新项目,并且没有以前存在的用户,那么您根本不必这样做)。添加信号处理程序后,每次添加用户后,它都会自动创建播放器对象;这就是信号处理程序的用途。所以最好的办法是在创建超级用户之前添加这个信号处理程序。好的,谢谢你的帮助!好的,当我在谷歌上寻找一个解决方案时,我确实遇到了一些信号,但我真的不确定使用它是否正确,或者如何使用它,所以谢谢你。但是你回答的第二部分让我有点困惑,你说在python manage.py shell中运行一个循环,但是每次在创建播放器模型对象之前出现用户存在的情况时,我都必须运行这样一个循环。出于好奇和稳健性,有没有一种直观的方法来自动化这个过程?我不知道你的意思。您只需精确地运行此循环一次,就可以为在向代码中添加信号处理程序之前存在的任何用户创建播放器对象(如果这是一个新项目,并且没有以前存在的用户,那么您根本不必这样做)。添加信号处理程序后,每次添加用户后,它都会自动创建播放器对象;这就是信号处理程序的用途。所以最好的办法是在创建超级用户之前添加这个信号处理程序。好的,谢谢你的帮助!