我正在尝试使n-to-n
关联的工作方式如下:它在该关联中的两个模型的管理页面中显示相应的关系。开箱即用的模型只有在其上定义了关系的模型才能在其管理页面上获取表单。所以我遵循了官方文件:
https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#inlinemodeladmin-objects
如您所见(在我的代码下面),我基本上添加了它所说的内容。
现在我的问题是此映射表中大约有35万行,但是如果我在数据库中选择一个bar
仅包含80 foos
,而反向选择可能是140。现在看来,它选择了14.7万行(!),因此即使我只是单击特定的foo
,它似乎还是以某种方式选择了整个连接表的一半。因此,以某种方式看来,这似乎并不是在两个具有id的模型之间进行简单的联接,当我查看sql日志时,它生成的SQL只是一次从一个表中选择内容,这很奇怪,因为联接可以只需一行即可完成。
所以我有一个具有以下模型的Django应用程序:
class Foo(models.Model):
id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
bars = models.ManyToManyField(Bar, related_name='foos')
bars
与foos
没有关系,这是n对n的工作方式。
现在,我想在/admin/bars/<id>
上展示它所涉及的所有foos
,在/admin/bars/<id>
上我想展示所有的bars
它有。 foos
端点可以自动使用,因为它是我定义的n-to-n
依赖模型,但是在bars
上它需要更多工作。
因此,我按照官方教程在admin.py
中创建了一个内联模型,并使两个管理员模型共享此内联:
class FooBarInline(admin.StackedInline):
model = Foo.bars.through
extra = 1
class FooAdmin(admin.ModelAdmin):
#... list_display, list_filter etc.
inlines = (FooBarInline, )
exclude = ('bars', )
class BarAdmin(admin.ModelAdmin):
#... list_display, list_filter etc.
inlines = (FooBarInline, )
有人能弄清楚为什么它会这样吗?我没有任何循环定义或任何东西,非常简单的n-to-n
rel TBH。还是给我一些有关如何调试Inline模型生成的SQL的指示?那么我也许可以自己找出答案。
非常感谢您!