gpt4 book ai didi

Django admin 使用带有多对多字段的 TabularInline 很慢

转载 作者:行者123 更新时间:2023-12-01 00:16:15 26 4
gpt4 key购买 nike

我正在尝试使用 Django admin 在一个请求中可视化所有样本。它有效,但它真的很慢。我尝试使用 prefetch , formset , raw_id_fields , 和 readonly_fields没有运气。当我加载超过 10 个样本时,它仍然很慢。我在这里遇到了 N+1 问题。我检查了 Django 调试工具栏,它对该请求中的每个示例进行了查询。

这是我的模型:

# This is where the sample has all information
class Inventory(models.Model):
sample_id = models.CharField(max_length=50, primary_key=True)

def __str__(self):
return '{0}'.format(self.sample_id)

# Intermediate model
class SampleRequestInventory(models.Model):
sample = models.ForeignKey("Inventory", on_delete=models.CASCADE)
request = models.ForeignKey("SampleRequest", on_delete=models.CASCADE)

# This is the request model that I'm looking
class SampleRequest(models.Model):
samples = models.ManyToManyField("Inventory", through="SampleRequestInventory")

这是我的 Django 管理员配置:
class SamplesInline(admin.TabularInline):
model = SampleRequestInventory
# raw_id_fields = ('sample',)
readonly_fields = ('sample',)
extra = 0

# this formset did not work either
# class MyInlineFormset(BaseInlineFormSet):
# def __init__(self, data=None, files=None, instance=None,
# save_as_new=False, prefix=None, queryset=None, **kwargs):
# super(MyInlineFormset, self).__init__(data, files, instance,
# save_as_new, prefix, queryset, **kwargs)
# self.queryset = SampleRequest.objects.all(). \
# prefetch_related('samples')

class SampleRequestAdmin(admin.ModelAdmin):
# This queryset for prefetching only makes an extra query...
def get_queryset(self, request):
qs = super(SampleRequestAdmin, self).get_queryset(request)
return qs.prefetch_related('samples')
# extra settings
list_display = ('date', 'status',)
ordering = ('date',)
# inline that causes the slowness
inlines = (SamplesInline, )
# I tried using formset as well, but didn't work
# formset = MyInlineFormset

最佳答案

尝试将以下内容添加到您的 SamplesInline:

def get_queryset(self, request):
qs = super(SamplesInline, self).get_queryset(request)
return qs.select_related('sample')
readonly_fields在您的 Inline 中导致额外的查找满足 __str__为您 Inventory类(class)。

关于Django admin 使用带有多对多字段的 TabularInline 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52386873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com