Final query optimisation for attendee_data view
This commit is contained in:
		
							parent
							
								
									ffe5194893
								
							
						
					
					
						commit
						ace7aa3efa
					
				
					 1 changed files with 10 additions and 4 deletions
				
			
		|  | @ -543,13 +543,19 @@ def attendee_data(request, form, user_id=None): | ||||||
|     ).exclude( |     ).exclude( | ||||||
|         cart__status=commerce.Cart.STATUS_RELEASED |         cart__status=commerce.Cart.STATUS_RELEASED | ||||||
|     ).select_related( |     ).select_related( | ||||||
|         "cart", "cart__user", "product", "product__category",  |         "cart", "cart__user", "product", "product__category", | ||||||
|     ).order_by("cart__status") |     ).order_by("cart__status") | ||||||
| 
 | 
 | ||||||
|  |     # Make sure we select all of the related fields | ||||||
|  |     related_fields = set( | ||||||
|  |         field for field in fields | ||||||
|  |         if isinstance(AttendeeProfile._meta.get_field(field), RelatedField) | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|     # Get all of the relevant attendee profiles in one hit. |     # Get all of the relevant attendee profiles in one hit. | ||||||
|     profiles = AttendeeProfile.objects.filter( |     profiles = AttendeeProfile.objects.filter( | ||||||
|         attendee__user__cart__productitem__in=items |         attendee__user__cart__productitem__in=items | ||||||
|     ).select_related("attendee__user") |     ).select_related("attendee__user").prefetch_related(*related_fields) | ||||||
|     by_user = {} |     by_user = {} | ||||||
|     for profile in profiles: |     for profile in profiles: | ||||||
|         by_user[profile.attendee.user] = profile |         by_user[profile.attendee.user] = profile | ||||||
|  | @ -578,7 +584,7 @@ def attendee_data(request, form, user_id=None): | ||||||
|         field_verbose = concrete_field.verbose_name |         field_verbose = concrete_field.verbose_name | ||||||
| 
 | 
 | ||||||
|         # Render the correct values for related fields |         # Render the correct values for related fields | ||||||
|         if isinstance(concrete_field, RelatedField): |         if field in related_fields: | ||||||
|             # Get all of the IDs that will appear |             # Get all of the IDs that will appear | ||||||
|             all_ids = profiles.order_by(field).values(field) |             all_ids = profiles.order_by(field).values(field) | ||||||
|             all_ids = [i[field] for i in all_ids if i[field] is not None] |             all_ids = [i[field] for i in all_ids if i[field] is not None] | ||||||
|  | @ -640,7 +646,7 @@ def attendee_data(request, form, user_id=None): | ||||||
|         attr = getattr(profile, field) |         attr = getattr(profile, field) | ||||||
| 
 | 
 | ||||||
|         if isinstance(field_type, models.ManyToManyField): |         if isinstance(field_type, models.ManyToManyField): | ||||||
|             return [str(i) for i in attr.all()] |             return [str(i) for i in attr.all()] or "" | ||||||
|         else: |         else: | ||||||
|             return attr |             return attr | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Christopher Neugebauer
						Christopher Neugebauer