2015-07-03 76 views
3

我遇到了一个有趣的问题,从Django 1.6.11升级到1.7。这似乎是基于我目前如何分割文件。目前,由于大量的方法,模型方法存储在与模型分开的文件中。Django 1.7 makemigrations - ValueError:无法序列化

例如,它被分解如下:

help 
|_ modelmethods 
| |_ __init__.py 
| |_ thread_methods.py 
|_ __init__.py 
|_ models.py 

__init__.py在帮助app文件夹看起来像这样:

""" __init__.py for help app.""" 

from help.modelmethods.thread_methods import * 

而且thread_methods.py看起来是这样的:

"""Methods for the Thread model.""" 

from help.models import Thread 

class ThreadMethods: 

    """Adds methods on to the Thread model.""" 

    def do_the_thing(self): 
     pass 

Thread.__bases__ += (ThreadMethods,) 

我从中看到的错误如下:

Migrations for 'help': 
    0001_initial.py: 
    - Create model Thread 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line 
    utility.execute() 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute 
    output = self.handle(*args, **options) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 124, in handle 
    self.write_migration_files(changes) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/core/management/commands/makemigrations.py", line 152, in write_migration_files 
    migration_string = writer.as_string() 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/db/migrations/writer.py", line 129, in as_string 
    operation_string, operation_imports = OperationWriter(operation).serialize() 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/db/migrations/writer.py", line 86, in serialize 
    arg_string, arg_imports = MigrationWriter.serialize(arg_value) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/db/migrations/writer.py", line 245, in serialize 
    item_string, item_imports = cls.serialize(item) 
    File "/Users/user/.virtualenvs/stuff/lib/python2.7/site-packages/django/db/migrations/writer.py", line 380, in serialize 
    raise ValueError("Cannot serialize: %r\nThere are some values Django cannot serialize into migration files.\nFor more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing" % value) 
ValueError: Cannot serialize: <class help.modelmethods.thread_methods.ThreadMethods at 0x1105c3870> 
There are some values Django cannot serialize into migration files. 
For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing 

我意识到它试图序列化这个类并对它进行窒息。有没有解决这个问题并保持分离的好方法?或者,唯一可比较的方法是将models.py文件拆分为具有正确__init__.py设置的模型文件夹,并且每个文件专用于同时包含所有相关方法(以及确保没有引入循环导入)的一个模型。

回答

1

你需要从对象类派生你的方法的模型,也尽量从ThreadMethods派生线程,而不是将它添加到__bases__来得到的。

class ThreadMethods(object): 
    # .... 
+0

有趣。我会试一试并回复你。 – bagelbits

+0

完全有效。我想我可能会遇到的唯一问题是用户模型,但这可能适用于它:http://stackoverflow.com/questions/1818223/best-way-to-add-convenience-methods-to-a-django-auth -user模型 – bagelbits

1

会发生这种情况的原因有很多,在我的情况,这是我设置为default=User.pk哪个user是造成问题。我的Django的版本是1.9

class Blog(models.Model): title = models.CharField(max_length=200) content = HTMLField() pub_date = models.DateTimeField('date published', auto_now_add=True) last_updated = models.DateTimeField('date published',default=timezone.now) user = models.ForeignKey(User, default=User.pk)#wrong user = models.ForeignKey(User, default=1)#correct, use any default value featured = models.ImageField(upload_to = 'featured', blank=True)

1

我无法因为一个自定义验证的迁移。我的问题是,我没有读过the manual正确,在那里说:

If a class-based validator is used in the validators model field option, you should make sure it is serializable by the migration framework by adding deconstruct() and __eq__() methods.

指向这解释了为什么你需要的deconstruct()__eq__()以及如何将它们写migrations-docs

还应该适用于其他类而不仅仅用于验证器。

相关问题