我有一个抽象模型类userabstract,它有字段id(主键),name(字段字段)和email(电子邮件字段)。 我在两个用户类usertemp中继承这个类。注册后,我希望数据存储在usertemp中。当用户单击确认邮件时,该数据将被传输到用户类。 但最新情况是,只要有人注册,就会更新usertemp模型,而不是创建一个新模型。用户类
也发生了同样的事情以下是模型和视图的代码
class UserAbstract(models.Model):
id = models.AutoField(db_column='ID', primary_key=True, default=1) # Field name made lowercase.
name = models.CharField(db_column='NAME', max_length=100, default='') # Field name made lowercase.
email = models.CharField(db_column='EMAIL', max_length=100, default='') # Field name made lowercase.
def __str__(self):
return self.name
class Meta:
abstract = True
@python_2_unicode_compatible
class User(UserAbstract):
def __str__(self):
return self.name ;
class Meta:
managed = True
db_table = 'User'
@python_2_unicode_compatible
class Validation(models.Model):
key = models.AutoField(primary_key=True)
key_data = models.CharField(max_length=100, default='')
create_time = models.DateTimeField()
expire_time = models.DateTimeField()
def __str__(self):
return self.key_data
@python_2_unicode_compatible
class UserTemp(UserAbstract):
validation_key = models.ForeignKey(Validation, models.DO_NOTHING, related_name='+', default='') # Field name made lowercase.
verified = models.BooleanField(default=False)
def __str__(self):
return self.validation_key.key_data
views.py
def signup(request):
if request.method == 'POST':
form = FormTemp(request.POST, request.FILES)
if form.is_valid():
primary = form.cleaned_data['email']
try:
qdict = {}
qdict['email'] = primary
user = UserTemp.objects.get(**qdict)
if user.verified==True:
return HttpResponse("Account already exists")
except:
pass
email = form.cleaned_data['email']
signer = hashlib.sha256()
signer.update(primary)
validation_key = signer.hexdigest()
confirm_key = request.build_absolute_uri('/signup-confirm/')+'?key='+validation_key
send_mail('Confirm Your Mail', confirm_key, settings.EMAIL_HOST_USER, [email,])
valid = Validation(key_data=validation_key, create_time=datetime.now(), expire_time=datetime.now()+timedelta(days=30))
valid.save()
argsdict = {}
argsdict['name'] = form.cleaned_data['name']
argsdict['email'] = form.cleaned_data['email']
argsdict['validation_key'] = valid
argsdict['verified'] = False
usertemp = UserTemp(**argsdict)
usertemp.save()
return HttpResponse("Confirmation mail sent")
else:
return HttpResponse('Invalid Data')
else:
return HttpResponse('What are you doing here ? Tresspass')
valid.save()工作正常,每次保存验证密钥但usertemp只包含一个模型,这是最新的模型。
当我尝试force_insert=True
时,它告诉我重复的条目存在相同的主键。正如您所看到的,主键字段id
是AutoField,那么为什么django在我写usertemp = UserTemp(**argsdict)
时没有创建新模型
答案 0 :(得分:1)
这里的问题是您已经为AutoField
提供了默认值。如果你没有提供它,你告诉Django为该字段分配值1
,这意味着你继续用相同的id
写行。
所以只需摆脱那个默认值。
更广泛的要点是defaults
是Django级别的功能,而AutoField
是数据库级功能。从数据库的角度来看,显式指定的列值和Django默认列值之间没有区别。