Как создать поле ManyToMany, основанное на другом поле?
Предположим, что у меня есть следующие модели:
class ProductFamily(models.Model):
family = models.CharField(primary_key=True, max_length=200)
class SubFeature(models.Model):
# this is all the subfeatures across all products
tag = models.CharField(primary_key=True, max_length=64, verbose_name="tag")
label = models.CharField(max_length=64, verbose_name="label")
description = models.CharField(max_length=256, verbose_name="description")
configurable = models.BooleanField(default=False)
class Product(models.Model):
product_name= models.CharField(
primary_key=True, max_length=64, verbose_name="product")
family = models.ForeignKey(
ProductFamily, on_delete=models.CASCADE)
core_subfeature = models.ManyToManyField(
SubFeature, blank=True, related_name="core")
optional_subfeature = models.ManyToManyField(
SubFeature, blank=True, related_name="optional")
class Meta:
constraints = [models.UniqueConstraint(fields=['product_name', 'family'], name='unique_products'),
models.UniqueConstraint(
fields=['product_name', 'core_subfeature'], name='unique_core_subfeatures'),
models.UniqueConstraint(fields=['product_name', 'optional_subfeature'], name="unique_optional_subfeatures")]
class ProductOrders(models.Model):
customer = models.CharField(max_length=400)
product_family = models.ForeignKey(
ProductFamily, on_delete=models.CASCADE)
issue_date = models.DateField(default=datetime.date.today)
product = models.ForeignKey(
Product, on_delete=models.PROTECT, blank=True, null=True)
Обратите внимание, что первые три модели будут содержать данные о продуктах, а модель ProductOrders будет получать данные, когда заполняется форма.
Теперь я хочу добавить поля "core_subfeature" и "optional_subfeature" в ProductOrders, но я хочу убедиться, что пользователю будут представлены только необязательные подфункции, которые доступны для данного продукта (основные подфункции будут предварительно заполнены для пользователя, так как они фиксированы для продукта). Я пробовал использовать ForeignKey (к таблице Product), но это требует, чтобы поля были уникальными для всей таблицы, я думаю, но одна подфункция может быть частью многих продуктов, так что это не то, что я могу добавить к полю. Поле ManyToMany в Product не имеет смысла, потому что я хочу, чтобы оно ссылалось на основную/опциональную подфункцию
Как мне добавить эти поля?
Лучшей идеей будет использование models.CharField, выполнение некоторого запроса к базе данных на уровне формы, чтобы форма отображала правильные основные/опциональные подфункции, пользователь выбирал, какие подфункции он хочет, а затем результат сохранялся как строка подфункций, разделенных запятыми? (как для основных_подфункций, так и для дополнительных_подфункций)