2016-04-02 3 views
0

У меня есть абстрактный класс модели userabstract, который имеет идентификаторы полей (первичный ключ), имя (поле символов) и адрес электронной почты (поле электронной почты). Я наследую этот класс в двух классах пользователя, usertemp. После регистрации я хочу, чтобы данные хранились в usertemp. Когда пользователь нажимает на подтверждающую почту, эти данные будут переданы классу пользователя. Но что происходит, всякий раз, когда кто-то подписывается, модель usertemp обновляется, а не создается новая. То же самое происходит с пользовательским классомDjango перезаписывает существующую модель

Вот код для моделей и представлений

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 то почему Джанго не создавая новую модель, когда я пишу usertemp = UserTemp(**argsdict)

ответ

1

Проблема здесь заключается в том, что вы дали свое AutoField значение по умолчанию. Вы говорите, что Django присваивает этому полю значение 1, если вы его не предоставите, а это значит, что вы продолжаете писать строки с тем же id.

Так что просто избавитесь от этого значения по умолчанию.

Более общий смысл заключается в том, что defaults являются функцией уровня Django, а AutoField - это функция уровня базы данных. С точки зрения базы данных нет никакой разницы между явно назначенными значениями столбцов и значениями столбцов Django по умолчанию.

+0

Это сработало. Большое спасибо, я искал свое решение более двух часов. –

Смежные вопросы