未为模型创建的Subclassed ForeignKey字段

时间:2014-04-16 17:49:36

标签: django foreign-keys

我一直在看Marty Alchin的Apress书“ProDjango”,我在最后一章(第11章)遇到了一个问题。我是Python和Django的相对noob,尽管我已经尝试过搜索,但我不能通过这个和其他论坛来指出类似的东西。我在这个网站上看过Is Pro Django book still relevant?但没有回答任何具体问题。

问题围绕着尝试创建跟踪变更的机制 - 添加,更改和删除的历史记录。第一步是在要跟踪的模型上创建用户字段。在示例项目中,他创建了一个专门的ForeignKey字段,硬编码与Django的内置“User”模型相关:

from django.db import models
from django.contrib.auth.models import User

class CurrentUserField(models.ForeignKey):
    def __init__(self, **kwargs):
        super(CurrentUserField, self).__init__(User, null=True, **kwargs)

稍后还有一个'contrib_to_class()方法。该类位于要应用的模型的单独models.py文件中。

据我所知,使用是在模型中添加一个引用这个新字段类的新字段:

e.g。

class SimpleModel(models.Model):
    a_user = CurrentUserField()

但问题是,当我在syncdb中无法找到该字段时,尝试访问它时会出现“FieldError”。

本书的解决方案中还有许多其他元素我没有尝试过这里复制,但这是第一个也是基本的部分。

我猜这里Django和/或Python本身的变化是负责任的。有没有人指点?

感谢。

编辑:在registration.py中给出以下类,这是current_user文件夹。这也是您发现models.py持有CurrentUserField类的地方。 InformationRequest模型具有:

user = CurrentUserField()

作为最后一个字段。所有导入都存在且显示正确。

class FieldRegistry(object):
    _registry = {}

    def add_field(self, model, field):
        reg = self.__class__._registry.setdefault(model, [])
        reg.append(field)

    def get_fields(self, model):
        return self.__class__._registry.get(model, [])

    def __contains__(self, model):
        return model in self.__class__._registry


In [1]: from current_user.registration import FieldRegistry

In [2]: from inforequest.models import InformationRequest

In [3]: registry = FieldRegistry()

In [4]: registry.add_field(InformationRequest, InformationRequest._meta.get_field('user'))
---------------------------------------------------------------------------
FieldDoesNotExist                         Traceback (most recent call last)
<ipython-input-4-6fcbbdcae066> in <module>()
----> 1 registry.add_field(InformationRequest, InformationRequest._meta.get_field('user'))

/usr/local/lib/python2.7/dist-packages/django/db/models/options.pyc in get_field(self, name, many_to_many)
    353             if f.name == name:
    354                 return f
--> 355         raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, name))
    356 
    357     def get_field_by_name(self, name):

FieldDoesNotExist: InformationRequest has no field named 'user'

尝试查看管理员会生成“未知字段...”

1 个答案:

答案 0 :(得分:0)

我想我已经找到了我的问题的答案:django-simple-history(https://django-simple-history.readthedocs.org/en/latest/),因为它提供了我试图实现的解决方案的一部分,显然它是建立在Marty Alchin的Pro代码中的Django的。