(value, lhs)
| 13 | |
| 14 | |
| 15 | def get_normalized_value(value, lhs): |
| 16 | from django.db.models import Model |
| 17 | |
| 18 | if isinstance(value, Model): |
| 19 | if not value._is_pk_set(): |
| 20 | raise ValueError("Model instances passed to related filters must be saved.") |
| 21 | value_list = [] |
| 22 | sources = composite.unnest(lhs.output_field.path_infos[-1].target_fields) |
| 23 | for source in sources: |
| 24 | while not isinstance(value, source.model) and source.remote_field: |
| 25 | source = source.remote_field.model._meta.get_field( |
| 26 | source.remote_field.field_name |
| 27 | ) |
| 28 | try: |
| 29 | value_list.append(getattr(value, source.attname)) |
| 30 | except AttributeError: |
| 31 | # A case like |
| 32 | # Restaurant.objects.filter(place=restaurant_instance), where |
| 33 | # place is a OneToOneField and the primary key of Restaurant. |
| 34 | pk = value.pk |
| 35 | return pk if isinstance(pk, tuple) else (pk,) |
| 36 | return tuple(value_list) |
| 37 | if not isinstance(value, tuple): |
| 38 | return (value,) |
| 39 | return value |
| 40 | |
| 41 | |
| 42 | class RelatedIn(In): |
no test coverage detected