Django m2m «насквозь» с общим иностранным ключом - PullRequest
2 голосов
/ 04 января 2011

У меня есть следующий пример кода, который представляет собой упрощенную абстракцию реального проекта, над которым я работаю:

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') в общую модель, в основном для целей пользовательского интерфейса администратора. Причина, по которой он является универсальным, заключается в том, что еще не определено, на скольких моделях будет размещена эта линия.

...