我正在工作的项目在数据库中有脏数据。基本上,最初的设计者创建了外键字段,但没有使用引用完整性来强制它们。现在有一些FK值是无效的,实际上并没有指向现有的记录。通常我只删除这些无效的FK值,但是位于这个db上的应用程序使用存储在这些FK字段中的文本数字0来指示其他信息。实际上没有主键为0的记录。在
我已经在Django的ORM类和ForeignKey字段中包装了这个有缺陷的表设计,但是它在ForeignKey字段的另一端找不到记录时抛出了很多doesnotex异常。我一直在试图找到一种方法,就在这个项目中,悄悄地捕捉这个异常,而不是在代码中到处乱扔try/except块来抛出这个异常。在本例中,我只想防止Django ORM抛出错误。在
我试图用一个自定义管理器来实现这个目标,方法是重写get()方法并使用use_for_related_field=True class属性。虽然在ForeignKey的键值无效的情况下,显然没有使用自定义管理器的get()方法。在
class FWManager(models.Manager):
"""
FW's data is "dirty". Primarily it isn't enforcing referential integrity on
many of it's foreign key fields leading to oprphaned records. Django throws a
DoesNotExist exception in this case which is troublesome having to catch it for
any fk field access.
Custom FWManager will silently "eat" the DoesNotExist error and return None
instead.
"""
use_for_related_fields=True
def get(self, *args, **kwargs):
#init
retval = None
try:
retval = super(FWManager, self).get(*args, **kwargs)
except:
# silently eat errors
pass
return retval
我需要一种方法来捕捉并吃掉潜在的自定义外键上的doesnotex错误,我正在寻找一个如何处理的例子。或者有人可以推荐一个更好的方法。在
我认为应该有更好的可能性来解决这个问题,因为您的解决方案仍然没有给您的数据库带来任何完整性。可能是:
null=True
,并将0更改为None
在(所有)异常上默默失败也会给您带来很多麻烦,因为您可能会在不知道的情况下遇到其他问题。。。。在
相关问题 更多 >
编程相关推荐