我必须将客户信息存储在Customer表中。我们无需存储他们的username
和password
。但是为了创建客户群和用户,我使用的是django的User
和Group
模型。这是客户模型,我用它来存储它的基本信息。
class Customer(models.Model):
"""
The Customer
"""
UID = models.TextField(blank=True, null=True, db_index=True)
fk_user = models.ForeignKey(User, primary_key=False)
fk_details = models.ForeignKey(UserDetails, primary_key=False)
fk_contact_details = models.ForeignKey(ContactDetails, primary_key=False)
...
这是一个创建用户对象的类方法,以后我用它来存储客户信息:
from django.contrib.auth.models import User
def create_user(self, req_dict):
'''
Create a new User
'''
try:
user=User.objects.create_user(**req_dict)
user.save()
except:
return None
return user
但是此代码抛出IntegrityError
,这是因为我们没有在req_dict
req_dict = {'first_name': u'John', 'last_name': u'Smith', 'email': u'john.smith@xyz.com'}
在创建新用户时,存储用户名可选的方式是什么?
答案 0 :(得分:3)
如果您想使用django.contrib.auth
,则无法将用户名字段设为可选。您总是必须在数据库中放置一个值。
为了绕过它,我建议您在create_user()
中为用户名生成一个值。您可以使用随机值,也可以通过电子邮件创建用户名。只要确保它是独一无二的。
答案 1 :(得分:2)
你可以让pre_save signal只提供默认值
pre_save.connect(give_default_username, sender=User)
def give_default_username(sender, instance, *args, **kwargs):
instance.username = 'default'
每当调用用户对象的save方法时,它将首先通过此方法附加所需的值,然后再继续使用save方法。
答案 2 :(得分:1)
我同意@zanderle最好为您的用户生成一些用户名。也许您可以使用他们的UID,电子邮件或类似的东西。
pre_save signal
可以解决您的问题,但是,就我而言,它会使您的系统更加隐含,因为您的模型与您的数据库不一致。
另一种方法 - 为匿名用户创建一些默认用户。因此,每个数据库记录都有用户分配,您不会强迫客户注册。