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…
Reference in a new issue