编辑:看看这个http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/ http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/
不幸的是,GenericForeignKey 的支持不如foreignkey。有一个开放(并已接受)的票证,其中包含为他们提供小部件的补丁:http://code.djangoproject.com/ticket/9976 http://code.djangoproject.com/ticket/9976
开箱即用的是使用 GenericForeignKey 内联管理对象。
假设您的通用关系是通过以下方式实现的
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
class News(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
...
and
class Topic(models.Model):
...
news = generic.GenericRelation('News') # if separate app: 'newsapp.News'
如果你想编辑某个主题的新闻,你可以为新闻定义一个内联管理:
from django.contrib.contenttypes.generic import GenericTabularInline
class NewsInline(GenericTabularInline):
model = News
并将其添加到主题管理的内联中:
class TopicAdmin(models.ModelAdmin):
inlines = (NewsInline, )
也就是说,从所提供的信息中我看不出您的多对多关系有什么问题。似乎表达了你所需要的。
也许您正在主题中而不是新闻和文章中定义 ManyToMany 字段?在新闻和文章中定义它们。
编辑:感谢您的澄清。您的模型设置将按照 arie 的帖子进行(即相反),并且您将进行内联编辑。如果您只想从新闻/文章/等中选择现有主题。例如,我不知道 GenericRelation 有什么开箱即用的东西(它通常只是充当反向查找助手)。你可以
a) 覆盖管理表单并根据 GenericRelation 添加带有查询集的 ModelMultipleChoiceField
b) 重写 save() 来调整关系。
工作量相当大。我个人会坚持使用多个 m2m 表,而不是将所有内容都塞到一张表中。如果您担心在请求一个或多个主题的所有新闻和文章等时数据库会进行多次查找,那么请注意,通用解决方案将始终具有与 GenericForeignKey 的要求类似的设置,即附加列型号和 ID。这可能会导致更多的查询(例如针对每个结果的 content_type)。