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随后将创建管理实例是正常的,因为保存总是由以下内容组成:
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()
。我不知道我为什么加上它