2014-02-16 60 views
0

我正在嘗試創建可代表數據庫中常用字段的mixins。在這個例子中,數據庫表格跟蹤記錄的創建時間,創建時間,編輯時間和編輯人員的情況非常普遍。要做到這一點,我已經創建了以下的混入:Django:將mixins用於常見模型字段

[項目] /libs/mixins/CreationAuditMixin.py:

from django.db import models 

class CreationAuditMixin(models.Model): 
    """ CreationAuditMixin documentation 
    """ 
    created_at = models.DateTimeField(auto_now_add=True) 
    created_by = models.CharField(max_length=255, blank=True, editable=False) 

    class Meta: 
     abstract = True 

[項目] /libs/mixins/ModificationAuditMixin.py:

from django.db import models 

class ModificationAuditMixin(models.Model): 
    """ ModificationAuditMixin documentation 
    """ 
    modified_at = models.DateTimeField(auto_now=True) 
    modified_by = models.CharField(max_length=255, blank=True, editable=False) 

    class Meta: 
     abstract = True 

[項目] /libs/mixins/FullAuditMixin.py(只是爲了方便):

from django.db import models 

from libs.mixins.audit import CreationAuditMixin, ModificationAuditMixin 

class FullAuditMixin(models.Model, CreationAuditMixin, ModificationAuditMixin): 

    class Meta: 
     abstract = True 

[項目] /庫/模型/曲estions/Context.py:

from django.db import models 

from libs.mixins.audit import FullAuditMixin, CreationAuditMixin, ModificationAuditMixin 

_app_label = 'questions' 
_db_table = '\".\"'.join((_app_label, 'context')) 

class Context(models.Model, FullAuditMixin): 
    """ Model representing a Context 
    """ 
    _format_string = "{}: {}, {} - {}" 

    name = models.CharField(max_length=255) 
    description = models.CharField(max_length=2000) 
    publish_start = models.DateTimeField() 
    publish_end = models.DateTimeField() 

    def __unicode__(self): 
     """ Returns a unicode representation of the model 
     """ 
     result = self._format_string.format(self.name, self.description, self.publish_start, self.publish_end) 
     return result 

    class Meta: 
     app_label = _app_label 
     db_table = _db_table 

我可以將模型轉移到他們的特定應用文件結構在稍後的時間,但現在已經有大約架構手動配置/ app_label/db_table所以這種結構不利於附加配置。

當嘗試任何進口上下文(大部分管理命令,在這種情況下,嘗試進行遷移)我收到以下錯誤:

./manage.py schemamigration questions --initial 
Traceback (most recent call last): 
    File "./manage.py", line 20, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 242, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 284, in execute 
    self.validate() 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 310, in validate 
    num_errors = get_validation_errors(s, app) 
    File "/usr/local/lib/python2.7/dist-packages/django/core/management/validation.py", line 34, in get_validation_errors 
    for (app_name, error) in get_app_errors().items(): 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 196, in get_app_errors 
    self._populate() 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 75, in _populate 
    self.load_app(app_name, True) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 99, in load_app 
    models = import_module('%s.models' % app_name) 
    File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 40, in import_module 
    __import__(name) 
    File "./apps/questions/models.py", line 1, in <module> 
    from libs.models.questions import Context 
    File "./libs/models/questions/Context.py", line 3, in <module> 
    from libs.mixins.audit import FullAuditMixin, CreationAuditMixin, EditAuditMixin 
    File "./libs/mixins/audit/FullAuditMixin.py", line 5, in <module> 
    class FullAuditMixin(models.Model, CreationAuditMixin, EditAuditMixin): 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 79, in __new__ 
    new_class = super_new(cls, name, bases, {'__module__': module}) 
TypeError: Error when calling the metaclass bases 
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases 

當我建這些混入,我已經諮詢Django: Creating a Mixin for Reusable Model Fieldshttp://www.djangocurrent.com/2011/05/django-aspect-oriented-models.html,我的方法是基於閱讀這些。任何想法,我如何能夠正確地構造這些mixin和這個錯誤的原因將不勝感激。

回答

2

上下文不應該從models.Model繼承,因爲它在mixin本身的繼承鏈中已經有了。出於同樣的原因,您可能還需要從FullAuditMixin中刪除models.Model。

+0

謝謝!我也有一個導入問題,因爲每個都在它自己的文件中,所以我將這些名稱作爲模塊而不是類導入。 – marr75