Как создать поле 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, выполнение некоторого запроса к базе данных на уровне формы, чтобы форма отображала правильные основные/опциональные подфункции, пользователь выбирал, какие подфункции он хочет, а затем результат сохранялся как строка подфункций, разделенных запятыми? (как для основных_подфункций, так и для дополнительных_подфункций)

Вернуться на верх