有关使用Django Orm的通用关系的这个错误的任何线索?

有关使用Django Orm的通用关系的这个错误的任何线索?,第1张

概述这是一个有趣的:-) 在EAV上工作,我们在运行时在模型中注入一个通用关系处理程序. model_cls是任何类,EavValue类具有指向它的泛型关系.它从EavValues到model_cls工作得很好,但另一方面我们需要注入一个访问器来缓解事情: generic_relation = generic.GenericRelation(EavValue, 这是一个有趣的:-)

在EAV上工作,我们在运行时在模型中注入一个通用关系处理程序.

model_cls是任何类,EavValue类具有指向它的泛型关系.它从EavValues到model_cls工作得很好,但另一方面我们需要注入一个访问器来缓解事情:

generic_relation = generic.GenericRelation(EavValue,object_ID_fIEld='entity_ID',content_type_fIEld='entity_ct',related_name=model_cls.__name__)generic_relation.contribute_to_class(model_cls,'eav_values')

同样,我们在运行时这样做,因为我们想让它适用于不可触摸的第三方库.

使用PatIEnt类作为model_cls进行单元测试时,会出现以下错误

eav_ng.patIEnt: Accessor for m2m fIEld 'eav_values' clashes with related m2m fIEld 'EavValue.PatIEnt'. Add a related_name argument to the deFinition for 'eav_values'.

现在,我们认为简单的解决方法是在GenericRelation中更改contrib_to_class或related_name的第二个参数,但事实并非如此!我们得到完全相同的错误,只有不同的名称.

第二个奇怪的是,使用sqlite而不是MysqL运行相同的单元测试:全部通过.

更重要的是,无论是订单还是测试,我们总是在第二次测试中得到这个错误.由于这个过程发生在寄存器方法中,并且我们在设置和拆除时调用寄存器和取消注册,我猜测我们的取消注册方法是不完美的.

最后一个奇怪的事实:我们在运行unittest时遇到错误,但我们无法手动重现它.最糟糕的是,在我的同事计算机上,当我们使用相同版本的Python,Django,Ubuntu和MysqL时,它不会出错.

我们解决了很多困难的问题,但我们仍然坚持这一点,所以任何线索都会受到赞赏.

更新:

这场精彩比赛的新线索:

在第245行(django 1.2.1)的django.core.management.valIDation中从此片段引发错误:

for r in rel_opts.get_all_related_many_to_many_objects():    if r.fIEld is not f:        if r.get_accessor_name() == rel_name:            e.add(opts,"Accessor for m2m fIEld '%s' clashes with related m2m fIEld '%s.%s'. Add a related_name argument to the deFinition for '%s'." % (f.name,rel_opts.object_name,r.get_accessor_name(),f.name))        if r.get_accessor_name() == rel_query_name:            e.add(opts,"Reverse query name for m2m fIEld '%s' clashes with related m2m fIEld '%s.%s'. Add a related_name argument to the deFinition for '%s'." % (f.name,f.name))

对我们来说,r.get_accessor_name()== rel_name为True,因为两者都是“患者”.

更新2:

当我们添加注册模型的应用程序时.任何型号,问题都不会再出现了.非注册理论……

我们有两个对称的错误(关系的两边).删除related_name会删除其中一个错误0_o

解决方法 找到了解决方案

添加通用关系以在模型类_Meta.local_many_to_many属性中放置引用,该属性是列表. Django检查,但没有办法摆脱它.修复是:

# remove remaining reference to the generic relation    for fIEld in model_cls._Meta.local_many_to_many:        if fIEld.name == 'eav_value': # your related name            model_cls._Meta.local_many_to_many.remove(fIEld)            break
总结

以上是内存溢出为你收集整理的有关使用Django Orm的通用关系的这个错误的任何线索?全部内容,希望文章能够帮你解决有关使用Django Orm的通用关系的这个错误的任何线索?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存