Django-admin中的UserProfile m2m字段-错误

问题描述

| 我的模特:
class UserProfile(models.Model):
    TYPES_CHOICES = (
        (0,_(u\'teacher\')),(1,_(u\'student\')),)
    user = models.ForeignKey(User,unique=True)
    type = models.SmallIntegerField(default=0,choices=TYPES_CHOICES,db_index=True)
    cities = models.ManyToManyField(City)
class City(models.Model):
    name = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50)
在admin.py中:
admin.site.unregister(User) 
class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserProfileAdmin(UserAdmin):
    inlines = [UserProfileInline]

admin.site.register(User,UserProfileAdmin)

@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
    \"\"\"Create a matching profile whenever a user object is created.\"\"\"
    if created:
        profile,new = UserProfile.objects.get_or_create(user=instance)
但是,当我添加新用户并选择城市时,会出现该错误:/ admin / auth / user / add /中的IntegrityError (1062,\“密钥\'user_id \'\”的重复条目\'3 \') 我的代码有什么问题?如果我没有选择任何城市-用户添加正确。通过某种方式,用户被多次添加到UserProfile中。     

解决方法

我最近也遇到过同样的问题。当您考虑它时,这实际上是很有意义的。当您在管理员中保存带有内联的表单时,它将先保存主模型,然后继续保存每个内联。保存模型时,将触发post_save信号,并创建一个UserProfile进行匹配,但是现在该保存内联了。 UserProfile内联被认为是新的,因为它以前不存在(没有pk值),因此它尝试另存为全新的和不同的UserProfile,并且由于违反唯一性约束而遇到了完整性错误。解决方案很简单。只需覆盖
UserProfile.save
def save(self,*args,**kwargs):
    if not self.pk:
        try:
            p = UserProfile.objects.get(user=self.user)
            self.pk = p.pk
        except UserProfile.DoesNotExist:
            pass

    super(UserProfile,self).save(*args,**kwargs)
本质上,这只是检查相关用户是否存在现有的UserProfile。如果是这样,它将此UserProfile的pk设置为该pk,以便Django进行更新而不是创建。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...