Связать классы моделей Django с экземплярами другой модели

Сильно отредактировано в ответ на комментарий @Todor.

[Я использую Django 1.7.6 и Python 3.4.1.]

-

Так что в моем проекте Django я определил Item модель с различными конкретными моделями подклассов. Я также определил Category модель. Игрушечная версия моих моделей выглядит так:

models.py

from django.db import models

class Item(models.Model):
    name = models.CharField()

class CleeseItem(Item):
    cleese = models.URLField()

class GilliamItem(Item):
    gilliam = models.IntegerField()

class JonesItem(Item):
    jones = models.EmailField()

class Category(models.Model):
    title = models.CharField()
    item_types = ????  # List of model classes

Теперь ???? выше мой вопрос. Для каждого Category Например, я хотел бы связать список Item подклассы. Не индивидуальный Item случаи, но Item подклассы.

Пример: скажем, я создаю определенный Category пример <Category: terry> , Теперь я хочу сказать Джанго, что GilliamItem а также JonesItem Подклассы относятся к "махровым" Category ,

-

Как я буду использовать это? Я хотел бы написать мнение следующим образом:

views.py

from django.shortcuts import render_to_response, get_object_or_404
from monty.models import Category

def category_page(request, cat_name):
    c = get_object_or_404(Category, name=cat_name)
    item_dict = {}
    for it in c.item_types:  # Recall item_types is a list of classes
        item_dict.update( {it.verbose_name_plural: it.objects.all()} )
    return render_to_response('category_page.html', {'items': item_dict})

А именно, мой взгляд (1) извлекает Category объект; (2) создает словарь, в котором ключами являются имена моделей, связанных с этим Category и значения являются QuerySets, содержащими все экземпляры этих моделей; и (3) поставляет этот словарь в шаблон.

Пример: я посещаю http://domain.com/category/terry/ , Представление извлекает Category объект с name='terry' из базы данных. c.item_types в строке 7 производит [GilliamItem, JonesItem] таким образом, словарь выглядит как { 'gilliam items': GilliamItem.objects.all(), 'jones items': JonesItem.objects.all() },

-

Наконец, я бы хотел, чтобы администратор сайта мог произвольно переставлять отображение между Category объекты и Item набирает через админ сайт. (Пример: однажды я мог бы решить отредактировать "Терри" Category удалять JonesItem от item_types и, возможно, добавить PratchettItem .)

2 ответа

Посмотрите на Джанго-полиморфный. Он обеспечивает отношения с внешним ключом и многие-ко-многим для унаследованных моделей.

Как я и подозревал, я добиваюсь прогресса, используя ContentTypes рамки. В частности, если я отредактирую Category модель выглядеть

from django.contrib.contenttypes.models import ContentType

class Category(models.Model):
    title = models.CharField()
    item_types = models.ManyToManyField(ContentType, null=True, blank=True)

Я получаю почти то, что хочу. Единственная оставшаяся проблема заключается в том, что это вызывает все модельные классы в моем проекте, тогда как меня интересуют только подклассы Item, Но я все ближе!

Другие вопросы по тегам