Сигналы 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-типа.