РЕДАКТИРОВАТЬ: Проверьте это http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/
GenericForeignKey, к сожалению, не так хорошо, как ForeignKey.Существует открытый (и принятый) тикет с патчем для предоставления им виджета: 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')
...
и
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.Кажется, он выражает то, что вам нужно.
Может быть, вы определяете поле ManyToMany в теме, а не в новостях и статьях?Определите их в новостях и статьях.
РЕДАКТИРОВАТЬ: Спасибо за разъяснения.Настройка вашей модели будет такой же, как в сообщении Arie (т. Е. Наоборот), и вы будете редактировать inline.Если вы просто хотите выбрать существующую тему изнутри News / Article / etc.Например, я не знаю ничего из коробки для GenericRelation (который обычно просто служит помощником обратного просмотра).Вы можете
a) Переопределить форму администратора и добавить ModelMultipleChoiceField с набором запросов в соответствии с GenericRelation
b) Переопределить save () для настройки отношений.
Довольномного работы.Я лично придерживался нескольких таблиц m2m и не собирал все в одну.Если вы боитесь, что база данных выполнит несколько поисков при запросе всех новостей, статей и т. Д. Одной или нескольких тем, то имейте в виду, что универсальное решение всегда будет иметь настройку, аналогичную требованиям GenericForeignKey, то есть дополнительные столбцы длямодель и идентификатор.Это может привести к гораздо большему количеству запросов (например, к content_type для каждого результата).