Связать классы моделей 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
, Но я все ближе!