Я новичок в Django, и мне было трудно понять, как это структурировать.
У меня есть базовый класс (модель), который имеет 2 производных класса.
Эти два производных класса имеют некоторые общие поля, которые я поместил в базовый класс. И у каждого производного класса есть свои поля.
Существует еще один класс, и одно из полей этого класса является внешним ключом. Этот внешний ключ должен быть одним из двух производных классов.
Чтобы принять оба типа классов, я использовал базовый класс в качестве модели для внешнего ключа.
Проблема с этим решением заключается в том, что когда я сериализирую данные и получаю данные, отображаются / обслуживаются только поля базового класса (данные) (поскольку внешний ключ использует базовый класс).
Как еще можно структурировать это так, чтобы внешний ключ мог принимать два или более аналогичных производных классов?
Вот код для некоторого контекста того, что я пробовал.
Базовый класс
class SizeClassification(models.Model):
name = models.CharField(blank=False, max_length=30)
sizeClassificationType = models.CharField(max_length=30, choices=SizeClassificationChoice.choices())
Производный класс 1
class SieveSizeClassification(SizeClassification):
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, null=True, related_name="sieveSizeClassificationsOfSupplier")
productReferenceNumber = models.CharField(blank=True, max_length=50, null=True)
Производный класс 2
class GemstonePropertySizeClassification(SizeClassification):
gemstoneSizePropertyType = models.CharField(blank=True, max_length=30, null=True, choices=GemstoneSizePropertyTypeChoice.choices())
unit = models.ForeignKey(Unit, on_delete=models.CASCADE, null=True, related_name="gemstonePropertySizeClassificationOfUnit")
Класс, внешний ключ которого может быть одним из двух производных классов
class SizeConfiguration(models.Model):
name = models.CharField(blank=False, max_length=30)
sizeClassification = models.ForeignKey(SizeClassification, on_delete=models.CASCADE, null=False, related_name="sizeConfigurationsOfSizeClassifications")
customSizeNamingTemplate = models.OneToOneField(CustomSizeNamingTemplate, on_delete=models.CASCADE, blank = False, null=False)
Сериализатор базового класса
class SizeClassificationSerializer(serializers.ModelSerializer):
class Meta:
model = SizeClassification
fields = ['id', 'name', 'sizeClassificationType']
Сериализаторы производных классов
class SieveSizeClassificationSerializer(serializers.ModelSerializer):
supplier = SupplierSerializer(many=False)
unit = UnitSerializer(many=False)
class Meta:
model = SieveSizeClassification
fields = ['id', 'name', 'sizeClassificationType', 'productReferenceNumber', 'supplier']
class GemstonePropertySizeClassificationSerializer(serializers.ModelSerializer):
class Meta:
model = GemstonePropertySizeClassification
fields = ['id', 'name', 'sizeClassificationType', 'gemstoneSizePropertyType', 'unit']
Сериализатор класса, который должен использовать внешний ключ на основе 2 или более производных классов
class SizeConfigurationSerializer(serializers.ModelSerializer):
customSizeNamingTemplate = CustomSizeNamingTemplateSerializer(many=False)
customSizes = CustomSizeSerializer(many=True)
sizeClassification = SizeClassificationSerializer(many=False)
class Meta:
model = SizeConfiguration
fields = ['id', 'name', 'sizeClassification', 'customSizeNamingTemplate', 'customSizes']
После создания нескольких экземпляров производных классов (GemstonePropertySizeClassification
& SieveSizeClassification
) и после присвоения этих экземпляров классу SizeConfiguration
выходной ответ при сериализации класса SizeConfiguration
был объектом, содержащим данные только базовый SizeClassification
класс. Тем не менее, я хотел бы знать, какой именно это был производный экземпляр (GemstoneProperty
или Sieve
), и какие связанные данные характерны для производного класса. Это желаемый результат.
Заранее спасибо за любую помощь, советы, предложения о том, как к этому подойти.