Я некоторое время искал, но не могу найти существующий вопрос для этого (хотя это может быть проблема незнания терминологии).
Я новичок в Django и пытаюсь создать дизайн, который со временем должен быть очень расширяемым, и заставить его работать с Django ORM. По сути, это ряд отношений «многие ко многим», использующих общую соединительную таблицу.
Дизайн представляет собой общую систему создания игр, в которой говорится: «Если вы соответствуете [требованиям], вы можете создать [награду], используя [стоимость] в качестве материалов». Это позволяет продавать предметы из любого количества магазинов, используя одну и ту же систему, и является достаточно универсальным, чтобы поддерживать широкий спектр механик — я видел, как это успешно использовалось в прошлом.
Django не поддерживает несколько отношений M2M, использующих одну и ту же соединительную таблицу (очевидно, поскольку у него нет возможности установить обратную связь), поэтому у меня, похоже, есть следующие варианты:
- Пусть он создаст свои собственные соединительные таблицы, которых в итоге будет шесть или более, или
- Используйте внешние ключи для соединительной таблицы вместо встроенной связи MTM.
Первый вариант немного запутан, так как я знаю, что в конечном итоге мне придется добавить дополнительные поля в соединительные таблицы. Второй вариант работает довольно хорошо. К сожалению, поскольку нет внешнего ключа от соединительной таблицы BACK к каждой из других таблиц, я постоянно борюсь с системой администратора, чтобы заставить ее делать то, что я хочу.
Вот затронутые модели:
class Craft(models.Model):
name = models.CharField(max_length=30)
description = models.CharField(max_length=300, blank=True)
cost = models.ForeignKey('Container', related_name="craft_cost")
reward = models.ForeignKey('Container', related_name="craft_reward")
require = models.ForeignKey('Container', related_name="craft_require")
class ShopContent(models.Model):
shopId = models.ForeignKey(Shop)
cost = models.ForeignKey('Container', related_name="shop_cost")
reward = models.ForeignKey('Container', related_name="shop_reward")
require = models.ForeignKey('Container', related_name="shop_require")
description = models.CharField(max_length=300)
class Container(models.Model):
name = models.CharField(max_length=30)
class ContainerContent(models.Model):
containerId = models.ForeignKey(Container, verbose_name="Container")
itemId = models.ForeignKey(Item, verbose_name="Item")
itemMin = models.PositiveSmallIntegerField(verbose_name=u"min amount")
itemMax = models.PositiveSmallIntegerField(verbose_name=u"max amount")
weight = models.PositiveSmallIntegerField(null=True, blank=True)
optionGroup = models.PositiveSmallIntegerField(null=True, blank=True,
verbose_name=u"option group")
Есть ли более простой и очевидный способ заставить это работать? Я пытаюсь разрешить встроенное редактирование информации ContainerContent из каждого связанного столбца в интерфейсе редактирования Craft.