gpt4 book ai didi

python - Django __unicode__ 和 FK 非常慢

转载 作者:行者123 更新时间:2023-11-28 21:28:01 24 4
gpt4 key购买 nike

如果我写类似的东西

class Chip(models.Model):
name = models.CharField(max_length=16)
shortname = models.CharField(primary_key=True, unique=True, max_length = 16)

def __unicode__(self):
return self.shortname

class ChipStepping(models.Model):

stepping = models.CharField (max_length=16)
ChipShortname = models.ForeignKey('Chip', db_column="ChipShortname")

def __unicode__(self):
return "%s:%s" % (self.ChipShortname, self.stepping)

class ComponentType(models.Model):
name = models.CharField (max_length=32)
ChipStepping = models.ForeignKey('ChipStepping', db_column="ChipStepping")

def __unicode__(self):
return "%s(%s)" % (self.name, self.ChipStepping);

class ComponentVendor(models.Model):
name = models.CharField (unique=True, max_length=16)
products = models.ManyToManyField('ComponentType', through='ComponentVendorProduct', related_name='vendors')

def __unicode__(self):
return "%s" % (self.name)

class ComponentVendorProduct(models.Model):
ComponentVendor = models.ForeignKey('ComponentVendor', db_column="ComponentVendor")
ComponentType = models.ForeignKey('ComponentType' , db_column="ComponentType")

并尝试为 ComponentVendor 创建一个管理页面

class ProductInline(admin.TabularInline):
model = ComponentVendor.products.through
extra = 0

class ComponentVendorAdmin(admin.ModelAdmin):
inlines = [ProductInline]
list_filter = ['products__name']
exclude = ['products']

admin.site.register(ComponentVendor, ComponentVendorAdmin)

生成的页面可能需要 30 秒以上的时间。加载从我进行的一些调试中,我发现它反复对 ChipStepping 和 Chip 进行冗余的单一查询,在 where 子句中使用相同的参数,而不是智能地构建一个可以查找所有数据的查询。

如果我从 ChipStepping 和 ComponentType 的 unicode 函数中删除外键引用,这个问题就会减少

如果我在管理页面中单击的供应商在 ComponentVendorProducts 中有足够的条目,该页面可能需要几分钟时间!

有什么方法可以减少管理页面上的数据库点击次数?

最佳答案

您的问题来自这样一个事实,即每次您在 ComponentType 实例上调用 __unicode__ 时,Django 都会执行数据库调用。

您的问题有两种解决方案:

  1. 您覆盖ProductInlinequeryset 方法以包含select_related('ChipStepping')(Django 1.3 及更高版本)。
  2. 或者,如果您也想在其他地方解决问题,您可能需要更改 ComponentType 的默认管理器(objects)get_query_set 方法让它包含 select_related 调用。

关于python - Django __unicode__ 和 FK 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262036/

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