2012-06-08 2 views
3

Я пишу поле галереи. Полевые подклассы ManyToManyField и добавляет собственный виджет ajax и прочее. Я хочу сделать это решение настолько компактным, насколько это возможно (я имею в виду - я хочу написать как мало кода, чтобы по возможности реализовать его в других проектах).Django ManyToMany общая «сквозная» модель

Я решил создать промежуточную таблицу (которая обеспечивает «сквозную» параметра ManyToManyField), который будет содержать информацию о заказе:

class IntermediateModel(models.Model): 
    from_content_type = models.ForeignKey(ContentType) 
    from_object_id = models.PositiveIntegerField() 
    from_content_object = generic.GenericForeignKey('from_content_type', 'from_object_id') 
    to_content_type = models.ForeignKey(ContentType) 
    to_object_id = models.PositiveIntegerField() 
    to_content_object = generic.GenericForeignKey('to_content_type', 'to_object_id') 
    order = models.PositiveIntegerField() 

возникают следующие вопросы:

  1. ли возможно ли иметь «сквозную» модель для m2m в django, имеющую оба внешних ключа, указывающих на общие отношения (например, выше)? Если да - как этого добиться?
  2. Если это возможно - может ли такая модель содержать общие отношения между более чем одним полем m2m? Нравится: Class < -> Промежуточный итог < -> Студент, Галерея < -> Промежуточный итог < -> Фото - как с использованием промежуточной модели, так и по модели?
  3. EDIT: только что протестировано - я могу;) Могу ли я использовать абстрактные классы со «сквозными» таблицами? Я понял, что если вышеупомянутый сложный сценарий не будет работать, я бы просто создал два абстрактных класса, которые обеспечивают упорядочение и некоторые другие вещи, а затем всегда создают нормальные подклассы, чтобы фактически построить некоторые отношения :)

ответ

1

Если разница между промежуточными моделями - это то, как вы их обрабатываете, возможно, вам просто нужно использовать его с «прокси». Я имею в виду, используя подклассу модели Django с опцией Meta, называемой «прокси», как True. Таким образом, вы можете обрабатывать их отдельно, но сохраняя их в одной таблице базы данных (если это вариант для ваших нужд).

Прочитано this. Возможно, это то, чего вы хотите. Вместо двух таблиц базы данных с одинаковой структурой вы можете иметь 1 таблицу с 2 (или более) способами доступа и обработки.

+0

Я хочу иметь поле заказа в промежуточной модели. Я хотел бы создать общий plug'n'play GalleryField. Наличие общей промежуточной модели избавило бы меня от тяжелого мета-класса (автоматическое создание промежуточной таблицы). Вот некоторые основные шаги для достижения этого (imaging.fields.GalleryField и рефераты модели в imaging.models) https://github.com/pielgrzym/django-imaging.git – pielgrzym

Смежные вопросы