我有时(每隔几个月一次)在一个突然停止工作的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应用程序中,如果这很重要的话。