如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?

Posted

技术标签:

【中文标题】如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?【英文标题】:How to make models connected via ManyToMany relationship editable in two places at the same time in Django admin? 【发布时间】:2011-09-11 12:54:53 【问题描述】:

我有两个模型 - 新闻和主题。新闻模型有一个与主题相关的 ManyToManyField,如下所示:

subjects = models.ManyToManyField(NewsSubject, verbose_name=u'Subjects', blank=True,null=True,related_name='news')

而且我不仅需要能够在管理员中为新闻选择主题,而且还需要在编辑主题时选择新闻。

我是从创建模型表单开始的:

class NewsSubjectForm(forms.ModelForm):

    news = ModelMultipleChoiceField(queryset=News.objects.all(), 
        label="News", 
        required=False,
        #initial=News.objects.all(),
    )

    class Meta:
        model = NewsSubject

这是一个问题 - 我应该如何根据反向多对多关系指定新闻的初始值?以及如何添加加号按钮进行简单添加?

【问题讨论】:

【参考方案1】:

我不确定它能否满足您的需求,但我已经通过使用 TabularInline 做了类似的事情。像这样的一些想法应该可以工作(我没有测试以下代码)。

class Subject(models.Model):
    ...

class News(models.Model):
    subject = models.ManyToManyField(Subject, through="NewsSubject")

class NewsSubject(models.Model):
    news = models.ForeignKey(News)
    subject = models.ForeignKey(Subject)  

class NewsOfSubjectInline(admin.TabularInline):
    model = NewsSubject
    raw_id_fields = ('news',)

class SubjectAdmin(admin.ModelAdmin):
    inlines = [NewsOfSubjectInline,]

class SubjectOfNewsInline(admin.TabularInline):
    model = NewsSubject
    raw_id_fields = ('subject',)

class NewsAdmin(admin.ModelAdmin):
    inlines = [SubjectOfNewsInline,]

【讨论】:

太棒了!对于友好的管理标签,请参阅 - ***.com/questions/4929009/…

以上是关于如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?的主要内容,如果未能解决你的问题,请参考以下文章

Django通过多对多ORM对象中的多个标签进行过滤

如何在 Django REST 中通过多对多发布模型

如何通过多对多字段(精确匹配)中的对象过滤 django 模型?

如何在 django 中处理未保存的多对多关系?

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

如何通过多对多关系获取与同一张表相关的行 - Laravel