Сигналы Django : Доступ к значению ManyToManyRel из экземпляра

У меня есть следующий сигнал :

@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.

instance._meta.get_fields()[0] - это объект queryset (поскольку он получен из M2M-отношения). Не уверен, что это то, что вы ищете, но вы можете вывести идентификаторы srdrevision, например print(instance.srdrevision.values_list("id", flat=True)), который выводит все идентификаторы ваших отношений (все идентификаторы, связанные с этим объектом и имеющие тип srdrevision).

Обратите внимание, что вы не можете захватить один конкретный идентификатор, потому что здесь может быть несколько объектов типа srdrevision, связанных с вашим экземпляром!

Необходимо также проверить тип instance._meta.get_fields()[0], прежде чем делать что-то еще, потому что он может быть не всегда M2M-типа.

Вернуться на верх