Недопустимый литерал valueerror для int () с базой 10 django в migrate при развертывании проекта django в heroku - PullRequest
0 голосов
/ 02 июня 2018

models.py

from __future__ import unicode_literals
from django.db.models.signals import post_save
from django.db import models
# Create your models here.
from django.contrib.auth.models import User

class Friend(models.Model):
    users = models.ManyToManyField(User)
    current_user = models.ForeignKey(User, related_name = 'owner',null=True)

    @classmethod
    def make_friend(cls, current_user, new_friend):
        friend, created = cls.objects.get_or_create(
        current_user = current_user
        )
        friend.users.add(new_friend)
    @classmethod
    def lose_friend(cls, current_user, new_friend):
        friend, created = cls.objects.get_or_create(
        current_user = current_user
        )
        friend.users.remove(new_friend)


class Post(models.Model):
    post=models.CharField(max_length=500)
    user=models.ForeignKey(User)
    data = models.DateTimeField(auto_now=True)

class UserProfileManager(models.Manager):
    def queryset(self):
        return super(UserProfileManager,self).get(queryset).filter(city='surat')

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    description = models.CharField(max_length=100,default='')
    city = models.CharField(max_length=100,default='')
    website = models.URLField(default='')
    phone = models.IntegerField(default=0)
    image = models.ImageField(upload_to='profile_image',blank=True)

    surat = UserProfileManager()
    def __str__(self):
        return self.user.username


def create_profile(sender,**kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile,sender=User)

views.py

from django.http import HttpResponse
from django.shortcuts import render,redirect
from django.contrib.auth.forms import UserCreationForm
from tutorial import views
from accounts.forms import Registrationform,EditProfileForm
from django.contrib.auth.forms import UserChangeForm,PasswordChangeForm
from django.contrib.auth.models import User
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
from .forms import HomeForm
from .models import Post,Friend

class HomeView(TemplateView):
    template_name = 'accounts/home.html'
    def get(self,request):
        form = HomeForm()
        posts=Post.objects.all()
        users = User.objects.exclude(id=request.user.id)
        friend =Friend.objects.get(current_user=request.user)
        friends = friend.users.all()
        args={
        'form':form,'posts':posts,'users':users,'friends': friends
        }
        return render(request,self.template_name, args)

    def post(self,request):
        form  = HomeForm(request.POST)
        if form.is_valid():
            post=form.save(commit=False)
            post.user=request.user
            post.save()
            text =form.cleaned_data['post']
            form = HomeForm()
            return redirect('accounts:home')
        args = {'form' : form,'text' : text}
        return render(request, self.template_name,args)


def change_friends(request, operation, pk):
    new_friend = User.objects.get(pk=pk)
    if operation == 'add':
        Friend.make_friend(request.user,  new_friend)
    elif operation == 'remove':
        Friend.lose_friend(request.user,  new_friend)
    return redirect ('accounts:home')




def register(request):
    if request.method == "POST":
        form = Registrationform(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/accounts')
        else:
            return HttpResponse('please fill all the fields and make sure new password must be match')
    else:
        form = Registrationform()
        args={'form' : form}
        return render(request,'accounts/reg_form.html',args)

@login_required
def view_profile(request,pk=None):
    if pk:
        user = User.objects.get(pk=pk)
    else:
         user = request.user
    args = {'user' : user}
    return render(request,'accounts/profile.html',args)
@login_required
def edit_profile(request):
    if request.user.is_authenticated():
        #<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
        if request.method=="POST":
            form = EditProfileForm(request.POST,instance=request.user)
            if form.is_valid():
                form.save()
                return redirect('/accounts/profile')
            else:
                return HttpResponse("please go back and write correct values")
        else:
            form  =  EditProfileForm(instance=request.user)
            args = {'form' : form}
            return render(request,'accounts/edit_profile.html',args)
    else:
        HttpResponse("hllo")
        return redirect('/accounts/login')
@login_required
def change_password(request):
    if request.user.is_authenticated():
        if request.method == "POST":
            form = PasswordChangeForm(data=request.POST,user=request.user)
            if form.is_valid():
                form.save()
                update_session_auth_hash(request, form.user)
                return redirect('/accounts/profile')
            else:
                return HttpResponse("password does not match,go back and try again")
        else:
            form = PasswordChangeForm(user=request.user)
            args = {'form' : form}
            return render(request,'accounts/change_password.html',args)
    else:
        return redirect ('/accounts/login')

form.py

from django.contrib.auth.forms import UserCreationForm,UserChangeForm
from django.contrib.auth.models import User
#from django.forms import RegistrationForm,EditProfileForm
from django import forms
from accounts.models import Post

class HomeForm(forms.ModelForm):
    post = forms.CharField(widget=forms.TextInput(
    attrs={
            'class':'form-control',
            'placeholder'  : 'write a post'


    }
    ))
    class Meta:
        model = Post
        fields = ('post',)


class Registrationform(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = (
        'username',
        'first_name',
        'last_name',
        'email',
        'password1',
        'password2',
        )
    def save(self,commit=True):
        user=super(Registrationform,self).save(commit=False)
        user.first_name= self.cleaned_data['first_name']
        user.last_name=self.cleaned_data['last_name']
        user.email=self.cleaned_data['email']
        if commit:
            user.save()
        return user
class EditProfileForm(UserChangeForm):
    #template_name = '/something/else'
    class Meta:
        model = User
        fields = (
        'email',
        'first_name',
        'last_name',
        'password'
         )

и ошибка

(.vEnv) jayu@broadwell-gt2:~/Desktop/tutorial$ heroku run python manage.py migrate
 ›   Warning: heroku update available from 7.0.82 to 7.0.83
Running python manage.py migrate on ⬢ jaysuthar... up, run.5398 (Free)
/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For details see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
  """)

Operations to perform:
  Apply all migrations: accounts, contenttypes, auth, admin, sessions
Running migrations:
  Rendering model states... DONE
  Applying accounts.0002_auto_20180514_0523...Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 200, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 92, in migrate
    self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/migration.py", line 123, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 482, in alter_field
    old_db_params, new_db_params, strict)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 564, in _alter_field
    old_default = self.effective_default(old_field)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 210, in effective_default
    default = field.get_db_prep_save(default, self.connection)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 728, in get_db_prep_save
    prepared=False)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 720, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1853, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: ''

Django продолжает выдавать следующее при развертывании проекта (ошибка во время миграции при запуске heroku run python manage.py migrate)

ValueError: invalid literal for int() with base 10: ''

Я хочу развернуть этот проект на heroku, он успешно работает до

git push heroku master --forc

но при переносе базы данных с помощью этой команды:

    heroku run python manage.py migrate

выдает ошибку valueerror.

где я допустил ошибку?

Если вы можете предоставитьлюбая помощь, я был бы очень признателен.

РЕДАКТИРОВАТЬ:

accounts.0002_auto_20180514_0523 файл:

# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2018-05-14 05:23
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('accounts', '0001_initial'),
    ]

    operations = [
        migrations.AlterField(
            model_name='userprofile',
            name='phone',
            field=models.IntegerField(default=0),
        ),
    ]

1 Ответ

0 голосов
/ 02 июня 2018

Очевидно, что в своей первой версии поле «телефон» вашего UserProfile было CharField по умолчанию пустой строки.Изменение типа существующего поля требует трехэтапной миграции: сначала создайте новое поле с нужным типом, создайте и примените миграцию, затем создайте миграцию данных, которая будет копировать исходные данные в новое поле с соответствующими преобразованиями, обработкой ошибок и т. Д., Инаконец, удалите исходное поле (создайте и примените миграцию).

НО: в вашем случае сделать это поле целым числом просто неправильно.Номер телефона НЕ целое число.Во-первых, потому что вы не можете добавлять, вычитать, умножать или делить телефонные номера, а затем потому, что телефонный номер может также содержать нечисловые символы (например, форматы международных телефонных номеров).

Думать, что все, что состоит из цифровых символов, должно бытьint является распространенной ошибкой новичка (так же, как использование чисел с плавающей точкой вместо десятичных чисел для хранения цен и расчетов).Если вы сомневаетесь, спросите себя, имеет ли смысл применять математические операции ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...