在 django 中如何自定义模型管理以同时保存在auth_user和另一个不相关的模型中?



在 django 3.0 中,我有 3 个模型类,它们来自一个抽象的模型类,如下所示:

class AbstractPerson(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.EmailField(unique=True)
muser_id = models.IntegerField(null=True, blank=True)
class Meta:
abstract = True
def save(self, *args, **kwargs):
if (not self.pk) and (self.email):
muser = User.objects.get(id=self.muser_id).count()
if muser:
u = User()
u.username = self.first_name.lower()
u.is_staff = True
u.first_name = self.first_name
u.last_name = self.last_name
u.email = self.email
u.save()
return super(AbstractPerson, self).save(*args, **kwargs)

模型类之一:客户类已从这个抽象类中分离出来。我通过覆盖抽象类模型的 save 方法来尝试将实例保存在 django 身份验证用户和客户模型中。客户模型表单定义如下 这在"添加客户"期间工作正常。

class CustomerForm(forms.ModelForm):
class Meta:
model = Customer
fields = "__all__"
def clean_email(self):
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).count():
raise forms.ValidationError(_("Email already exists"),
code='invalid')
return email

但在编辑客户期间,客户的电子邮件 ID 以及所有其他属性也可能更改。然后如何访问同一客户的相应身份验证用户详细信息?我需要将用户"id"值存储在客户实例的"muser_id"属性中。 我使用了instance_post_save方法,如下所示:

def instance_post_save(sender, instance, created, **kwargs):
if created:
#print(type(instance),'iiiii')
try:
u = User()
u.username = instance.first_name
u.is_staff = True
u.first_name = instance.first_name
u.last_name = instance.last_name
u.email = instance.email
u.save(commit=True)
u = User.objects.get(email=instance.email)
instance.update({muser_id: u.id})
instance.save()
print(instance,'tttttttttttttttt')
except Exception as e:
log.info(e)        
u = User.objects.get(id=instance.muser_id)
u.username = instance.first_name
u.is_staff = True
u.first_name = instance.first_name
u.last_name = instance.last_name
u.email = instance.email
u.save()
return

这不允许我将用户 ID 保留在客户模型实例中,以便在编辑客户期间可以访问它。我该如何实现此目的?注意:电子邮件 ID 在应用程序中定义的所有模型中都是唯一的,包括客户、用户等。

最终解决:抽象人类保存方法更改:

def save(self, *args, **kwargs):
if (not self.pk) and (self.email):
muser = User.objects.filter(email=self.email).count()  # changed

instance_post_save方法更改:

def instance_post_save(sender, instance, created, **kwargs):
if created:
muser = User.objects.get(email=instance.email)
instance.muser_id=muser.id
instance.save()
else:
u = User.objects.get(id=instance.muser_id)
u.username = instance.first_name
u.is_staff = True
u.first_name = instance.first_name
u.last_name = instance.last_name
u.email = instance.email
u.save()
return

尝试扩展用户模型:

from django.contrib.auth.models import User
class AbstractPerson(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, editable=False)
some attributes
class OtherPerson(AbstractPerson):
#... attrs ...

然后实现用户模型的扩展模型的用户注册和配置,以更改某些模型的字段,例如 AbstractPerson 的子类可以使用像 UpdateView 这样的通用视图并指定字段。 因此,这两种模型都与一对一关系相关,而不是通过您必须不断使用来筛选和获取用户的 id 相关联。

相关内容

最新更新