Django admin prefetch related on property
У меня есть модели Merchant
и PhoneNumber
. PhoneNumber
имеет внешний ключ к Merchant
, а Merchant
имеет свойство business_phone_number
, которое извлекает первый номер телефона из набора номеров телефонов. В Django admin, для модели Merchant
, у меня business_phone_number
в list_display
. Хотя я поставил prefetch_related(phonenumber_set)
, он все равно запрашивает PhoneNumber
100 раз. Что я делаю не так? Вот упрощенный код:
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
и затем в Django admin у меня есть:
@admin.register(Merchant)
class MerchantAdmin(admin.ModelAdmin):
list_display = ("name", "business_phone_number", ...)
...
Я ввел get_queryset:
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related("phonenumber_set")...
Хит в db составил queryset.first()
.
Для работы с префетчированными данными следует использовать только prefetched_something.all()
.
в вашем случае:
@property
def business_phone_number(self):
for number in self.phonenumber_set.all():
return number
или вы можете использовать next()
.
@property
def business_phone_number(self):
return next((number for number in self.phonenumber_set.all()), None)
Вы можете использовать self.phonenumber_set.all().iterator()
вместо генератора, но я не использовал его с предварительной выборкой данных.