Единая «сквозная» модель для нескольких полей 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)