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() вместо генератора, но я не использовал его с предварительной выборкой данных.

Вернуться на верх