Django正在覆盖现有模型

时间:2016-04-02 06:35:09

标签: python django

我有一个抽象模型类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)时没有创建新模型

1 个答案:

答案 0 :(得分:1)

这里的问题是您已经为AutoField提供了默认值。如果你没有提供它,你告诉Django为该字段分配值1,这意味着你继续用相同的id写行。

所以只需摆脱那个默认值。

更广泛的要点是defaults是Django级别的功能,而AutoField是数据库级功能。从数据库的角度来看,显式指定的列值和Django默认列值之间没有区别。