Django合并2个模型实例,问题是m2m字段指定了一个中介mod

2024-06-28 19:38:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用一个脚本来自动合并2个Django模型实例(因此它可以用于我系统中的任何类型的模型)。但是在处理指定中间模型的m2m字段的部分(定义此字段时使用through参数)时有一个问题,我得到错误:AttributeError: Cannot use remove() on a ManyToManyField which specifies an intermediary model. Use <MyModel>'s Manager instead

# Migrate all many to many references from alias object to primary object.
for related_many_object in get_all_related_many_to_many_objects(alias_object):
    alias_varname = related_many_object.get_accessor_name()
    obj_varname = related_many_object.field.name

    if alias_varname is not None:
        # standard case
        related_many_objects = getattr(alias_object, alias_varname).all()
    else:
        # special case, symmetrical relation, no reverse accessor
        related_many_objects = getattr(alias_object, obj_varname).all()
    for obj in related_many_objects.all():
        getattr(obj, obj_varname).add(primary_object) #This line raises the AttributeError
        getattr(obj, obj_varname).remove(alias_object)

下面是返回需要合并的对象的所有m2m字段的函数:

def get_all_related_many_to_many_objects(obj):
    return [
        f for f in obj._meta.get_fields(include_hidden=True)
        if f.many_to_many and f.auto_created
    ]

关于这个案子我有两个问题:

  1. 是否有任何内置函数允许我区分指定中间模型的m2m字段和不指定中间模型的m2m字段?(因为对于普通的m2m字段,这个add()函数似乎工作得很好)。你知道吗
  2. 对于指定的m2m字段,如何将模型实例优雅地移除/添加到该关系中?你知道吗

谢谢你的时间!你知道吗


Tags: toin模型objforgetobjectsobject