Django - общие отношения в админке django - есть ли способ предварительно получить данные, вместо того, чтобы делать запрос к базе данных для каждого поля в каждой строке и столбце?
У меня есть следующие модели (все упрощено):
class Car(models.Model):
field_int = models.IntegerField(_('field_int'), null=True)
field_datetime= models.DateTimeField(_('field_datetime'))
field_boolean = models.BooleanField(_('field_boolean'), default=False)
class Bus(models.Model):
field_int = models.IntegerField(_('field_int'), null=False)
field_datetime= models.DateTimeField(_('field_datetime'))
field_boolean = models.BooleanField(_('field_boolean'), default=True)
и у меня есть что-то вроде vehicle report model
с общим отношением, чтобы я мог "объединить/слить" и показать данные обеих моделей одновременно в панели администратора django list_display
class VehiclesReport(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Meta:
indexes = [
models.Index(fields=["content_type", "object_id"]),
]
def field_int_generic(self):
return self.content_object.field_int
def field_datetime_generic(self):
return self.content_object.field_datetime
def field_boolean_generic(self):
return self.content_object.field_boolean
Я создаю объекты в скрипте следующим образом (это пример для класса Car, но то же самое для класса Bus):
VehiclesReport.objects.create(
content_type=ContentType.objects.get_for_model(Car),
object_id=car.object_id,
)
И со всеми этими моделями и данными я создал панель администратора, чтобы я мог отображать все одновременно:
class VehiclesReportAdmin(ModelAdmin):
list_display = (
'field_int_generic',
'field_datetime_generic',
'field_boolean_generic',
)
ordering = ('content_type',)
admin_site.register(VehiclesReport, VehiclesReportAdmin)
Все работает как шарм, но django вместо предварительной выборки всех данных, он делает запрос для каждого field_int_generic
, field_datetime_generic
, field_boolean_generic
выполнения, даже если это все тот же "ряд".
Допустим, у меня есть 'VehiclesReportAdmin', но с 10 колонками, как field_int_generic
и ограничением в 20 страниц...
У меня есть 200 запросов к базе данных всего для 20 строк данных. Вместо одного большого префетча или 18 запросов для каждой строки, и все это обрабатывается django автоматически
Есть ли какой-нибудь способ или метод, который я могу переопределить, чтобы сделать его более оптимизированным?
Буду благодарен за любую помощь!