Django 1.8:非确定性" FieldError:无法解析关键字"在related_name上

时间:2017-06-28 09:41:04

标签: python django

我有时(每隔几个月一次)在一个突然停止工作的ForeignKey关系上反向查找时出现问题。 FK字段位于动态创建的模型上(在启动时仅由自定义模型元类创建一次)。以下是负责FK字段的行:

'tag': models.ForeignKey(model, related_name='items')

attrs dict上的一个字段作为type构造函数的第三个参数传递。)

FieldError由Tag.objects.filter(items__content_type__pk=ctype.pk)等查询引发。

现在,重启后这种情况永远不会发生。它惊讶地攻击并开始搞乱对gunicorn工作者的请求(受影响的查询的所有请求都会引发错误)。重新启动应用程序有帮助。显然我无法重现它。有时它会在一两个小时后自行修复。我已经读过很多关于同一个异常的帖子,但似乎没有一个与我的问题有关。

一些实际的代码(缩短了一点):

def create_intermediary_table_model(model):
    """Create an intermediary table model for the specific tag model"""
    name = model.__name__ + 'Relation'

    class Meta:
        db_table = '%s_relation' % model._meta.db_table
        unique_together = (('tag', 'content_type', 'object_id'),)
        app_label = model._meta.app_label

    # Set up a dictionary to simulate declarations within a class
    attrs = {
        '__module__': model.__module__,
        'Meta': Meta,
        'tag': models.ForeignKey(model, related_name='items'),
        'content_type': models.ForeignKey(ContentType),
        'object_id': models.PositiveIntegerField(db_index=True),
        'content_object': GenericForeignKey('content_type', 'object_id'),
    }

    return type(name, (models.Model,), attrs)


class TagMeta(ModelBase):
    """Metaclass for tag models (models inheriting from TagBase)."""
    def __new__(mcs, name, bases, attrs):
        model = super(TagMeta, mcs).__new__(mcs, name, bases, attrs)
        if not model._meta.abstract:
            # Create an intermediary table and register custom managers for concrete models
            model.intermediary_table_model = create_intermediary_table_model(model)
        return model


class TagBase(models.Model):
    """Abstract class to be inherited by model classes."""
    __metaclass__ = TagMeta

    class Meta:
        abstract = True


class Tag(TagBase):
    name = models.CharField(_('name'), max_length=120, db_index=True)

Tag课程位于另一个django应用程序中,如果这很重要的话。

0 个答案:

没有答案