Единая «сквозная» модель для нескольких полей m2m

Я пытаюсь расширить и рефакторить некоторый унаследованный проект. У меня есть некоторый набор моделей, которые представляют «железо» некоторого ассеминированного устройства. Что-то вроде :

class ComponentA(models.Model)
    brand = models.CharField()
    model = models.CharField()
    category = models.ForeignKey(Category)

class Configuration(models.Model):
    component_a = ForeignKey(ComponentA)
    component_b = ForeignKey(ComponentB)
    component_n...

class Device(models.Model):
    configuration = models.ForeignKey(Configuration)

Цель - расширить ComponentA...ComponentN полем Many2Many, которое должно содержать некоторые дополнительные части и количество частей, из которых оно состоит. Однако мне показалось странным иметь through модель для каждой Component модели. Все Component модели должны иметь количество для дальнейшей статистики/расчетов. Есть ли какой-то «чистый» подход для реализации такой функциональности?

Модель ComponentListing позволяет добавить количество для каждого элемента конфигурации. Теперь Configuration может содержать произвольно выбранное количество Components через ComponentsListing, который добавляет к нему указанное количество.

Подумайте, как вы хотите настроить функциональность on_delete.

# models.py
class Component(models.Model):
    brand = models.CharField(max_length=XXX)
    model = models.CharField(max_length=XXX)
    category = models.ForeignKey(Category, on_delete=models.XXX)

class ComponentListing(models.Model):
    component = models.ForeignKey(Component, on_delete=models.XXX, related_name='listings')
    quantity = models.IntegerField()
    configuration = models.ForeignKey('Configuration', on_delete=models.XXX, related_name='component_listings')

    def __str__(self):
        return f"{self.component} - {self.quantity}"
    
class Configuration(models.Model):
    # no field required

class Device(models.Model):
    configuration = models.ForeignKey(Configuration, on_delete=models.XXX)
# python manage.py shell
d = Device.objects.get(id=XXX)

for listing in d.configuration.component_listings.all():
    print(listing)
    print(listing.quantity)
    print(listing.component.model)
    print(listing.component.category.XXX)
Вернуться на верх