I have models Merchant and PhoneNumber. PhoneNumber has a foreign key to Merchant, and Merchant has property business_phone_number which fetches the first phone number in the set of the phone numbers. In Django admin, for the Merchant model, I have business_phone_number in list_display. Although I've put prefetch_related(phonenumber_set), it still queries PhoneNumber 100 times. What am I doing wrong? Here's the simplified code:
class PhoneNumber(models.Model):
...
merchant = models.ForeignKey("merchant.Merchant", on_delete=models.SET_NULL, null=True, blank=True)
...
class Merchant(models.Model):
...
...
@property
def business_phone_number(self):
number = self.phonenumber_set.first()
if number:
return number.phone_number
return None
and then in Django admin I have:
@admin.register(Merchant)
class MerchantAdmin(admin.ModelAdmin):
list_display = ("name", "business_phone_number", ...)
...
I've put in get_queryset:
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related("phonenumber_set")...
CodePudding user response:
The hit in db made queryset.first().
For work with prefetched data you should use only prefetched_something.all().
in your case:
@property
def business_phone_number(self):
for number in self.phonenumber_set.all():
return number
or you can use next().
@property
def business_phone_number(self):
return next((number for number in self.phonenumber_set.all()), None)
You can use self.phonenumber_set.all().iterator() instead of generator, but i have not use it with prefetch data.
