Django-uuUnicode和FK非常s

2024-07-04 14:02:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我写一些

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创建一个管理页面

^{pr2}$

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

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

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

有没有办法可以减少数据库在管理页面上的点击次数?在


Tags: nameselfmodelreturnmodelsdefunicode页面
2条回答

您可能还想查看此处给出的建议: http://blog.ionelmc.ro/2012/01/19/tweaks-for-making-django-admin-faster/

似乎每一行的选择都是经过计算的,因此使用formfield_for_dbfield可以缓存链接中建议的选项。这样可以节省到数据库来渲染外键的每个下拉/选择框

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

您有两种解决方案:

  1. 重写ProductInlinequeryset方法,以包含select_related('ChipStepping')(django1.3及更高版本)。在
  2. 或者,如果您想在其他地方解决这个问题,您可能需要更改ComponentType的默认管理器(objectsget_query_set方法,使其包含select_related调用。在

相关问题 更多 >

    热门问题