加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:21:07 所属栏目:Python 来源:网络整理
导读:这是一个有趣的:-) 在EAV上工作,我们在运行时在模型中注入一个通用关系处理程序. model_cls是任何类,EavValue类具有指向它的泛型关系.它从EavValues到model_cls工作得很好,但另一方面我们需要注入一个访问器来缓解事情: generic_relation = generic.Generic
这是一个有趣的:-)

在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读