Create a reversed field path. E.g. Given (Order, "user__groups"), return (Group, "user__order"). Final field must be a related model, not a data field.
(model, path)
| 509 | |
| 510 | |
| 511 | def reverse_field_path(model, path): |
| 512 | """Create a reversed field path. |
| 513 | |
| 514 | E.g. Given (Order, "user__groups"), |
| 515 | return (Group, "user__order"). |
| 516 | |
| 517 | Final field must be a related model, not a data field. |
| 518 | """ |
| 519 | reversed_path = [] |
| 520 | parent = model |
| 521 | pieces = path.split(LOOKUP_SEP) |
| 522 | for piece in pieces: |
| 523 | field = parent._meta.get_field(piece) |
| 524 | # skip trailing data field if extant: |
| 525 | if len(reversed_path) == len(pieces) - 1: # final iteration |
| 526 | try: |
| 527 | get_model_from_relation(field) |
| 528 | except NotRelationField: |
| 529 | break |
| 530 | |
| 531 | # Field should point to another model |
| 532 | if field.is_relation and not (field.auto_created and not field.concrete): |
| 533 | related_name = field.related_query_name() |
| 534 | parent = field.remote_field.model |
| 535 | else: |
| 536 | related_name = field.field.name |
| 537 | parent = field.related_model |
| 538 | reversed_path.insert(0, related_name) |
| 539 | return (parent, LOOKUP_SEP.join(reversed_path)) |
| 540 | |
| 541 | |
| 542 | def get_fields_from_path(model, path): |
no test coverage detected