Django: Как настроить внешний ключ, модель которого может исходить из одного или нескольких производных классов? - PullRequest
1 голос
/ 13 мая 2019

Я новичок в 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), и какие связанные данные характерны для производного класса. Это желаемый результат.

Заранее спасибо за любую помощь, советы, предложения о том, как к этому подойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...