У меня есть следующий пример кода, который представляет собой упрощенную абстракцию реального проекта, над которым я работаю:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class FeatureSet(models.Model):
"""
Feature Set
"""
name = models.CharField(max_length=255)
def __unicode__(self):
return u"%s" % self.name
class GenericObjectAlpha(models.Model):
title = models.CharField(max_length=255)
feature_sets = models.ManyToManyField(FeatureSet, through='Feature')
def __unicode__(self):
return u"%s" % self.title
class GenericObjectBeta(models.Model):
title = models.CharField(max_length=255)
feature_sets = models.ManyToManyField(FeatureSet, through='Feature')
def __unicode__(self):
return u"%s" % self.title
class Feature(models.Model):
"""
Feature
"""
# FK to feature set
feature_set = models.ForeignKey(FeatureSet)
# FK to generic object, Generic object alpha or beta... or others
content_type = models.ForeignKey(
ContentType,
default='article',
limit_choices_to={ 'model__in': ('genericobjectalpha', 'genericobjectbeta') },
related_name="play__feature_set__feature")
object_id = models.PositiveIntegerField(
"Feature object lookup")
content_object = generic.GenericForeignKey(
'content_type',
'object_id')
# Extra fields on a m2m relationship
active = models.BooleanField()
order = models.PositiveIntegerField()
def __unicode__(self):
return u"%s::%s" % (self.feature_set, self.content_object)
Эта строка вызывает ошибку:
feature_sets = models.ManyToManyField(FeatureSet, through='Feature')
Очевидно, потому что сквозной модели не хватает соответствующего FK для каждой стороны m2m. Здесь я хотел бы добиться того, чтобы одна сторона отношения m2m была общей, и что я мог бы указать свою собственную таблицу промежуточных соединений для обычного добавления пользовательских полей и т. Д.
Какие у меня есть варианты для этого?
Обратите внимание, в настоящее время важным требованием является включение строки feature_sets = models.ManyToManyField(FeatureSet, through='Feature')
в общую модель, в основном для целей пользовательского интерфейса администратора. Причина, по которой он является универсальным, заключается в том, что еще не определено, на скольких моделях будет размещена эта линия.