谢谢您抽出宝贵时间来研究我的问题。我正在使用以下方法开发小型项目管理应用程序:带有Django 2.1.5的Python 3.6]
在为模型进行移植时,我遇到了一些问题。
[基本上,我正在建立一个主要的项目模型,与此相关联的是其他活动。在进行迁移时,我必须在终端中执行以下输出:
NOTE表示:对于“ project_creator”迁移,在创建模型之后添加OneToOneFields和ForeignKeys。
(env) $ python manage.py makemigrations Migrations for 'authentication': authentication/migrations/0001_initial.py - Create model User - Create model Profile - Create model Roles Migrations for 'project_creator': project_creator/migrations/0001_initial.py - Create model ProjectBudgetModel - Create model ProjectDatesModel - Create model ProjectDescriptionModel - Create model ProjectMember - Create model ProjectModel - Create model ProjectProblemsToDescriptionModel - Create model ProjectTasksToDescriptionModel - Add field project to projectmember # - Add field project_member to projectmember - Add field project to projectdescriptionmodel - Add field updated_by to projectdescriptionmodel - Add field project to projectdatesmodel - Add field updated_by to projectdatesmodel - Add field project to projectbudgetmodel - Add field responsible to projectbudgetmodel - Add field updated_by to projectbudgetmodel
当我迁移到PostgreSQL数据库时,出现ValueError:
$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, authentication, authtoken, contenttypes, guardian, projects, sessions, token_blacklist Running migrations: Applying contenttypes.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0001_initial... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying authentication.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying authtoken.0001_initial... OK Applying authtoken.0002_auto_20160226_1747... OK Applying guardian.0001_initial... OK Applying projects.0001_initial...Traceback (most recent call last): File "manage.py", line 15, in <module> execute_from_command_line(sys.argv) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv self.execute(*args, **cmd_options) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute output = self.handle(*args, **options) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 203, in handle fake_initial=fake_initial, File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/migrations/executor.py", line 117, in migrate state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration state = migration.apply(state, schema_editor) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/migrations/migration.py", line 124, in apply operation.database_forwards(self.app_label, schema_editor, old_state, project_state) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/migrations/operations/fields.py", line 84, in database_forwards field, File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 421, in add_field definition, params = self.column_sql(model, field, include_default=True) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 168, in column_sql default_value = self.effective_default(field) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 239, in effective_default return field.get_db_prep_save(default, self.connection) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/models/fields/related.py", line 937, in get_db_prep_save return self.target_field.get_db_prep_save(value, connection=connection) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 790, in get_db_prep_save return self.get_db_prep_value(value, connection=connection, prepared=False) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 956, in get_db_prep_value value = self.get_prep_value(value) File "/Users/radoo/Projects/006_Projects/MrProject/env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 965, in get_prep_value return int(value) ValueError: invalid literal for int() with base 10: 'Not Defined'
这里是我的代码的一部分。基本上,我创建一个项目,然后通过OneToOneFields或ForeignKeys将其他模型链接到它。
from django.contrib.auth import get_user_model
from django.db import models
from django.db.models.signals import post_save
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from guardian.shortcuts import assign_perm
User = get_user_model()
class ProjectModel( models.Model ):
TYPE_CHOICES = (
("A", "A"),
("B", "B"),
("C", "C"),
("O", "O")
)
DEPARTMENT = (
("R&D", "Research and Development"),
("OPERATIONS", "Production and operations"),
("SCM", "Supply chain management"),
("PGM", "Program Management"),
("SALES", "Sales Management"),
("STRATEGIC", "Strategic"),
("IT", "Information Technology"),
("OTHER", "Other"),
)
REGIONS = (
("EU", "Europe"),
("ASIA", "Asia"),
("NORTH_AMERICA", "North America"),
("SOUTH_AMERICA", "Middle East and Africa"),
("MEAT", "Middle East and Africa"),
("OTHER", "Other Region"),
)
id = models.AutoField( _( "ID" ), primary_key=True, unique=True )
title = models.CharField( _( "Project Title" ), max_length=100, unique=True, blank=False, null=False )
slug = models.SlugField( unique=True )
project_number = models.CharField( _( "Project Number" ), max_length=50, unique=True )
project_type = models.CharField( _( "Project Type" ), max_length=2, choices=TYPE_CHOICES, default="O" )
project_department = models.CharField( _( "Department" ), max_length=50, choices=DEPARTMENT, default="OTHER" )
project_region = models.CharField( _( "Region" ), max_length=50, choices=REGIONS, default="OTHER" )
created_at = models.DateTimeField( _( "Created at" ), auto_now_add=True )
updated_at = models.DateTimeField( _( "Updated at" ), auto_now=True )
created_by = models.ForeignKey( User, related_name="projects_created", null=True, on_delete=models.DO_NOTHING )
updated_by = models.ForeignKey( User, related_name="projects_update", null=True, blank=True,
on_delete=models.DO_NOTHING )
is_approved = models.BooleanField( default=False )
approved_by = models.ForeignKey( User, null=True, blank=True, on_delete=models.DO_NOTHING )
class Meta:
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_project', "View Project"),
)
verbose_name = _( 'project' )
verbose_name_plural = _( 'projects' )
db_table = "project_model"
def save(self, *args, **kwargs):
top = ProjectModel.objects.all().count()
series = "{:0>6}".format( top )
self.project_number = "%s-%s-%s"%(str( self.project_type ), str( self.project_department ), str( series ))
self.slug = slugify( self.title )
super().save( *args, **kwargs )
def __str__(self):
return "%s / %s"%(str( self.project_number ), str( self.title ))
class ProjectDescriptionModel( models.Model ):
project = models.OneToOneField(
ProjectModel, on_delete=models.CASCADE
)
updated_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING )
updated_at = models.DateTimeField( _( "Updated at" ), auto_now=True )
current_situation = models.TextField( _( "Current Situation" ), blank=True, default="No situation described" )
project_scope = models.TextField( _( "Project Scope" ), blank=True, default="No scope described" )
not_project_scope = models.TextField( _( "Not in Project Scope" ), blank=True, default="No scope described" )
benefit = models.TextField( _( "Benefit" ), blank=True, default="No benefit described" )
target = models.TextField( _( "Target" ), blank=True, default="No target described" )
slug = models.SlugField( unique=True )
def save(self, *args, **kwargs):
self.slug = self.project.slug
super().save( *args, **kwargs )
class Meta:
verbose_name = "description"
verbose_name_plural = "description"
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_description', "View description"),
)
db_table = "project_description"
def __str__(self):
return "%s-%s"%("Description for project: ", str( self.project.title ))
class ProjectDatesModel( models.Model ):
project = models.ForeignKey(
ProjectModel, on_delete=models.CASCADE
)
description = models.CharField( _( "Activity description" ), max_length=255, default="A short description",
blank=True, null=False )
started_date = models.DateField( _( "Started date" ), auto_now_add=True )
due_date = models.DateField( _( "Planned date" ), null=True, blank=True )
done_date = models.DateField( _( "Done date" ), null=True, blank=True )
delayed = models.BooleanField( _( "Delayed" ), default=False )
ongoing = models.BooleanField( _( "On going" ), default=False )
done = models.BooleanField( _( "Done" ), default=False )
updated_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING, related_name="date_member" )
def save(self, *args, **kwargs):
super().save( *args, **kwargs )
class Meta:
verbose_name = "date"
verbose_name_plural = "dates"
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_date', "View Date"),
)
db_table = "project_dates"
def __str__(self):
return "%s-%s"%(str( self.project.project_number ), str( self.description ))
class ProjectBudgetModel( models.Model ):
project = models.OneToOneField(
ProjectModel, on_delete=models.CASCADE
)
updated_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING )
updated_at = models.DateTimeField( _( "Updated at" ), auto_now=True )
cost_center = models.CharField( _( "Cost Center" ), max_length=20, null=False, blank=False, default="Not Defined" )
responsible = models.ForeignKey(
User, on_delete=models.DO_NOTHING, related_name="responsible_budget", blank=True, default="Not Defined" )
cost = models.FloatField( _( "Project Costs in Eur" ), null=True )
investments = models.FloatField( _( "Project Investment in Eur" ), null=True )
budget_cost = models.BooleanField( _( "Budgeted Costs" ), default=False )
budget_invest = models.BooleanField( _( "Budgeted Investments" ), default=False )
slug = models.SlugField( unique=True )
def save(self, *args, **kwargs):
self.slug = self.project.slug
super().save( *args, **kwargs )
class Meta:
verbose_name = "budget"
verbose_name_plural = "budgets"
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_budget', "View Budget"),
)
db_table = "project_budget"
def __str__(self):
return "%s-%s"%("Budget for project: ", str( self.project.project_number ))
class ProjectMember( models.Model ):
project_member = models.ForeignKey(
User, on_delete=models.DO_NOTHING )
project = models.ForeignKey(
ProjectModel, on_delete=models.CASCADE )
is_project_manager = models.BooleanField( default=False )
is_sponsor = models.BooleanField( default=False )
is_team_member = models.BooleanField( default=False )
is_collaborator = models.BooleanField( default=False )
is_controller = models.BooleanField( default=False )
is_steering = models.BooleanField( default=False )
is_initiator = models.BooleanField( default=False )
department = models.CharField( _( "Department" ), max_length=50, default="No Department set" )
requires_signature = models.BooleanField( default=False )
# def save(self, *args, **kwargs):
# # self.is_team_member = True
# super().save( *args, **kwargs )
class Meta:
verbose_name = _( 'member' )
verbose_name_plural = _( 'members' )
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_member', "View Team"),
)
db_table = "project_member"
def __str__(self):
return "%s / %s"%(str( self.project_member.email ), str( self.project.project_number ))
class ProjectProblemsToDescriptionModel( models.Model ):
project_description = models.ForeignKey(
ProjectDescriptionModel, on_delete=models.CASCADE
)
updated_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING )
updated_at = models.DateTimeField( _( "Updated at" ), auto_now=True )
problem = models.CharField( _( "Problems" ), default="State a problem", max_length=50, blank=False, null=False )
class Meta:
verbose_name = "problem"
verbose_name_plural = "problems"
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_problem', "View problem"),
)
db_table = "project_problem_to_description"
def __str__(self):
return "%s-%s"%("Problem for project: ", str( self.project_description.project.project_number ))
class ProjectTasksToDescriptionModel( models.Model ):
project_description = models.ForeignKey(
ProjectDescriptionModel, on_delete=models.CASCADE
)
updated_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING )
updated_at = models.DateTimeField( _( "Updated at" ), auto_now=True )
task = models.CharField( _( "Task" ), default="State a task", max_length=50, blank=False, null=False )
class Meta:
verbose_name = "task"
verbose_name_plural = "tasks"
default_permissions = ('add', 'change', 'delete')
permissions = (
('view_task', "View task"),
)
db_table = "project_task_to_description"
def __str__(self):
return "%s-%s"%("Task for project: ", str( self.project_description.project.project_number ))
我尝试过的:1)启动一个新应用=>相同的问题;
2)先迁移ProjectModel(基础模型),然后再迁移其他=>可行,但未迁移权限模型。
3)一次迁移一个模型=>可行,但适得其反。特别是当我有序列化和视图等时。
谢谢您抽出宝贵时间来研究我的问题。我正在使用以下程序开发小型项目管理应用程序:Python 3.6与Django 2.1.5,在进行迁移时遇到一些问题...
错误提示您正在尝试将字符串“未定义”保存在整数字段中。因此,只需检查模型的所有整数字段(包括ForeignKey
字段),您可能会将“未定义”设置为default
值。