Django:Django Admin中具有唯一外键的用户配置文件

Django:Django Admin中具有唯一外键的用户配置文件,django,inline,admin,django-signals,foreign-keys,Django,Inline,Admin,Django Signals,Foreign Keys,我使用名为UserExtension的自定义用户配置文件扩展了Django的用户模型。 它通过一个唯一的ForeignKey关系与用户相关,这使我能够在管理员中以内联形式编辑它! 我正在使用一个信号为每个新用户创建一个新的配置文件: def create_user_profile(sender, instance, created, **kwargs): if created: try: profile, created = UserExt

我使用名为
UserExtension
的自定义用户配置文件扩展了Django的用户模型。 它通过一个唯一的ForeignKey关系与用户相关,这使我能够在管理员中以内联形式编辑它! 我正在使用一个信号为每个新用户创建一个新的配置文件:

def create_user_profile(sender, instance, created, **kwargs):  
    if created:
        try:  
            profile, created = UserExtension.objects.get_or_create(user=instance)
        except:
            pass  

post_save.connect(create_user_profile, sender=User) 
(如本文所述,例如:) 问题是,如果我通过admin创建了一个新用户,那么在保存“列user_id不唯一”时,我会得到一个IntegritiyError。似乎没有两次调用该信号,但我猜管理员正在尝试在之后保存配置文件?
但是如果我在系统的其他部分创建新用户,我需要通过信号创建

django随后将创建管理实例是正常的,因为保存总是由以下内容组成:

  • 创建用户对象
  • 创建配置文件对象(不能在前面,因为它指向用户)
  • 保存用户对象时,django ORM无法知道创建概要文件对象将在它之后出现,因此它不会以任何方式延迟post_save信号(甚至没有意义)

    如果要保留post_保存信号,最好的处理方法(imho)是将
    UserExtension
    的保存方法重写为如下内容:

    def save(self, *args, **kwargs):
        try:
            existing = UserExtension.objects.get(user=self.user)
            self.id = existing.id #force update instead of insert
        except UserExtension.DoesNotExist:
            pass 
        models.Model.save(self, *args, **kwargs)
    

    请注意,这会强制指向与现有对象相同的用户的每个插入成为更新,这可能是代码其他部分的意外行为。

    我们可以看到您的get\u或\u create管理器吗?它是django的默认管理器!重写模型的默认保存方法对我来说似乎是一个好主意,而且很简单,我必须检查它是否在所有用例中都适用!我认为“existing=UserExtension.objects.all().get(user=self.user)”可以是“existing=UserExtension.objects.get(user=self.user)”,或者您有什么特别的想法吗?:)谢谢没什么特别的,据我所知,你不需要
    .all()
    。我不知道我为什么加上它