You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中,能否为无关联的两个模型建立StackedInline连接?

Django无关联模型实现StackedInline方案

首先先修正你代码里的拼写错误(这些错误会导致代码无法运行):

修正后的模型代码

class Item(models.Model):
    name = models.CharField(max_length=250)
    description = models.TextField()  # 修正model→models的拼写错误

class Photo(models.Model):
    item = models.CharField(max_length=250)  # 修正ChaField→CharField的拼写错误
    title = models.CharField(max_length=250)  # 修正ChaField→CharField的拼写错误

实现无关联Inline的Admin配置

Django默认的Inline依赖外键关联,要实现无关联模型的Inline,需要自定义Inline的查询和保存逻辑,代码如下:

from django.contrib import admin
from .models import Item, Photo

class PhotoInline(admin.StackedInline):
    model = Photo

    # 过滤出和当前编辑Item对应的Photo(通过name匹配)
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        if self.parent_obj:
            return queryset.filter(item=self.parent_obj.name)
        return queryset.none()

    # 保存Photo时自动关联当前Item的name
    def save_model(self, request, obj, form, change):
        obj.item = self.parent_obj.name
        super().save_model(request, obj, form, change)

class ItemAdmin(admin.ModelAdmin):
    inlines = [PhotoInline]

    # 把当前编辑的Item对象传递给Inline,让Inline能获取到关联依据
    def get_inline_instances(self, request, obj=None):
        inline_instances = super().get_inline_instances(request, obj)
        for inline in inline_instances:
            inline.parent_obj = obj
        return inline_instances

admin.site.register(Item, ItemAdmin)  # 修正原代码里的"strong text"错误
admin.site.register(Photo)

关键逻辑说明

  • get_queryset:根据当前编辑的Item的name,过滤出对应的Photo,确保编辑Item时只显示关联的照片。
  • save_model:在保存Photo时,自动将当前Item的name赋值给Photo的item字段,维持两者的关联关系。
  • get_inline_instances:把当前编辑的Item对象传递给Inline组件,让Inline能拿到关联的依据。

内容的提问来源于stack exchange,提问作者Noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:55:32