Django 信号:从实例访问 ManyToManyRel 值

问题描述 投票:0回答:1

我有以下信号:

@receiver(post_save, sender=Document)
def handle_added_or_edited_element(sender, instance, **kwargs):
    '''
    This signal is used to compare the original and the current instance of the object being saved.
    If at least one field has changed, a row is inserted in the revision history of the related srd_revision
    '''
    for field in sender._meta.get_fields():
        if field.name in ['srd_revision', 'srdrevision', 'srd_rev']:
            print(instance._meta.get_fields()[0])
        if not isinstance(field, (models.ManyToOneRel, models.ManyToManyRel)):
            if instance._get_field_value_map(instance._meta)[field.name].value != instance.__original_instance._get_field_value_map(instance._meta)[field.name].value:
                chapter, message = RevisionHistory().get_document_messages(instance=instance, created=False, updated_field=field.name)
                SrdRevisionHistory(chapter=chapter, title=message)

这两行:

if field.name in ['srd_revision', 'srdrevision', 'srd_rev']:
    print(instance._meta.get_fields()[0])

给我一个ManyToManyRel:

<ManyToManyRel: srdapp.srdrevision>

我想访问与

id
对象相关的
srdrevision
对象的
Document

django django-models django-signals
1个回答
0
投票

instance._meta.get_fields()[0]
是一个查询集对象(因为它来自 M2M 关系)。不确定这是否是您要查找的内容,但您可以打印
srdrevision
的 id,例如
print(instance.srdrevision.values_list("id", flat=True))
,它会打印您的所有关系 id(与此对象相关且属于
srdrevision
类型的所有 id)。

请注意,您无法获取一个特定的 id,因为可能有多个

srdrevision
类型的对象与您的实例相关!

© www.soinside.com 2019 - 2024. All rights reserved.