【问题标题】:Subclassed ForeignKey field not created for model未为模型创建子类 ForeignKey 字段
【发布时间】:2014-04-16 17:49:35
【问题描述】:

我一直在看 Marty Alchin 的 Apress 书籍“ProDjango”,但在最后一章(第 11 章)遇到了问题。我是 Python 和 Django 的相对菜鸟,虽然我尝试过四处搜索,但我无法通过这个论坛和其他论坛找到类似的东西。我在这个网站上看到过Is Pro Django book still relevant?,但没有回答任何具体问题。

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

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 文件中。

据我了解,其用途是在模型中添加一个引用此新字段类的新字段:

例如

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

但问题是,当我 syncdb 找不到该字段时,“FieldError”是尝试访问它的常见结果。

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

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

谢谢。

编辑:给定registration.py中的以下类,即current_user文件夹。这也是您找到包含 CurrentUserField 类的 models.py 的地方。 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'

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

【问题讨论】:

  • 请显示您收到的确切错误消息,包括回溯。

标签: django foreign-keys


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 2018-03-01
    • 2016-06-30
    • 2020-12-31
    • 2017-04-19
    • 2021-04-20
    • 2021-12-23
    • 2020-06-06
    相关资源
    最近更新 更多