我有一组看起来像这样的模型:
class Page(models.Model):
title = models.CharField(max_length=255)
class LinkSection(models.Model):
page = models.ForeignKey(Page)
title = models.CharField(max_length=255)
class Link(models.Model):
linksection = models.ForeignKey(LinkSection)
text = models.CharField(max_length=255)
url = models.URLField()
Run Code Online (Sandbox Code Playgroud)
和一个看起来像这样的admin.py:
class LinkInline(admin.TabularInline):
model = Link
class LinkSectionInline(admin.TabularInline):
model = LinkSection
inlines = [ LinkInline, ]
class PageAdmin(admin.ModelAdmin):
inlines = [ LinkSectionInline, ]
Run Code Online (Sandbox Code Playgroud)
我的目标是获得一个管理界面,让我可以在一个页面上编辑所有内容.这个模型结构的最终结果是生成的东西生成一个看起来或多或少的视图+模板:
<h1>{{page.title}}</h1>
{% for ls in page.linksection_set.objects.all %}
<div>
<h2>{{ls.title}}</h2>
<ul>
{% for l in ls.link_set.objects.all %}
<li><a href="{{l.url}}">{{l.title}}</a></li>
{% endfor %}
</ul>
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
据我所知,我知道Django管理员中的inline-in-an-inline技巧失败了.有谁知道允许这种三级模型编辑的方法?提前致谢.
我有我认为简单的查询,但它需要"永远".我对SQL优化不太满意,所以我想我可以问你们.
这是查询,使用EXPLAIN:
EXPLAIN SELECT *
FROM `firms_firmphonenumber`
INNER JOIN `firms_location` ON (
`firms_firmphonenumber`.`location_id` = `firms_location`.`id`
)
ORDER BY
`firms_location`.`name_en` ASC,
`firms_firmphonenumber`.`location_id` ASC LIMIT 100;
Run Code Online (Sandbox Code Playgroud)
结果:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'firms_location', 'ALL', 'PRIMARY', '', '', '', 73030, 'Using temporary; Using filesort'
1, 'SIMPLE', 'firms_firmphonenumber', 'ref', 'firms_firmphonenumber_firm_id', 'firms_firmphonenumber_firm_id', '4', 'citiadmin.firms_location.id', 1, ''
Run Code Online (Sandbox Code Playgroud)
firm_location上的键:
Keyname Type Unique Packed Field Cardinality
PRIMARY BTREE Yes No id 65818
firms_location_name_en BTREE No No name_en 65818
Run Code Online (Sandbox Code Playgroud)
firm_firmphonenumber上的键:
Keyname Type …Run Code Online (Sandbox Code Playgroud)