具有额外字段的DRF多态性manytomy

2024-06-17 08:00:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在修补Django Rest框架,以构建一个api,该api可以处理电子元件的物料清单(BoM)。你知道吗

我使用的是django多态和django rest多态,因此我可以为组件使用多态模型(它们有共享属性,但我仍然希望以大致相同的方式处理它们)。多态模型非常适合这个目的)。你知道吗

一切都很好,直到我介绍了一个'通过'属性多对多的关系。我想要的是一个BoM表,有几个不同的组成部分,每个与数量,例如,BoM1有2x470k电阻和3x 100uF电容器。你知道吗

你知道吗型号.py:(删减了一点,以免这篇文章成为史诗小说)

class BoM(models.Model):
    """Bill of Materials: a list of all parts and their quantities for a given pedal"""
    pedal = models.ForeignKey(Pedal, on_delete=models.CASCADE)
    variant = models.CharField(max_length=100, blank=True)
    electronic_components = models.ManyToManyField(
        'ElectronicComponent', through='ElectronicComponentQty', blank=True)

    class Meta:
        verbose_name = 'Bill of materials'
        verbose_name_plural = 'Bills of materials'

    def __str__(self):
        return str(self.pedal)


class ElectronicComponent(PolymorphicModel):
    """Shared data model for electronic components"""
    value = models.CharField(max_length=20)
    datasheet = models.FileField(upload_to='uploads/components', blank=True)

    def __str__(self):
        return self.value


class ElectronicComponentQty(models.Model):
    """Combination of resistor and quantity"""
    bom = models.ForeignKey(BoM, on_delete=models.CASCADE)
    component = models.ForeignKey(
        ElectronicComponent, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)

    class Meta:
        verbose_name = 'Elecronic component quantity'
        verbose_name_plural = 'Electronic component quantities'


class Resistor(ElectronicComponent):
    """Resistor data model"""
    WATTAGES = [('1/4w', '1/4w'), ('1/8w', '1/8w')]

    wattage = models.CharField(max_length=4, choices=WATTAGES, default='1/4w')



class Capacitor(ElectronicComponent):
    """Capacitors (all kinds)"""
    VOLTAGE_RATINGS = [
        ('16V', '16V'),
        ('35V/50V', '35V/50V'),
    ]

    CAP_TYPES = [
        ('ceramic disk', 'ceramic disk'),
        ('film', 'film'),
        ('electrolytic', 'electrolytic'),
        ('tantalum', 'tantalum'),
        ('other', 'other'),
    ]

    capacitor_type = models.CharField(
        max_length=20, choices=CAP_TYPES, default='film')
    voltage_rating = models.CharField(
        max_length=10, choices=VOLTAGE_RATINGS, blank=True)

你知道吗序列化程序.py地址:

class ElectronicComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ElectronicComponent
        fields = '__all__'


class ElectronicComponentQtySerializer(serializers.ModelSerializer):
    class Meta:
        model = ElectronicComponentQty
        fields = '__all__'


class BoMSerializer(serializers.ModelSerializer):
    electronic_components = ElectronicComponentQtySerializer(
        many=True, read_only=True)

    class Meta:
        model = BoM
        fields = '__all__'

class ResistorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Resistor
        fields = '__all__'


class CapacitorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Capacitor
        fields = '__all__'


class ElectronicComponentPolySerializer(PolymorphicSerializer):
    model_serializer_mapping = {
        Resistor: ResistorSerializer,
        Capacitor: CapacitorSerializer,
    }

用这段代码我可以创建EletronicComponentQty对象没有问题。但是,当我尝试列出BoM表(通过序列化程序)时,我得到: 属性错误位于/pedalparts/boms/ 在尝试获取上的字段bom的值时获取AttributeError 序列化程序ElectronicComponentQtySerializer。 序列化程序字段的名称可能不正确,并且与任何字段都不匹配 Capacitor实例上的属性或键。 最初的异常文本是:“Capacitor”对象没有属性 '物料清单'。你知道吗

有人知道我怎么解决这个问题吗?我愿意接受任何改变,使这项工作。你知道吗


Tags: oftruemodel属性modelsallbomlength
1条回答
网友
1楼 · 发布于 2024-06-17 08:00:00

因为BoM模型上的electronic_components指的是ElectronicComponent模型,所以它不应该使用ElectronicComponentQtySerializer,而是可以序列化正确的实例,很可能是ElectronicComponentSerializerElectronicComponentPolySerializer。你知道吗

相关问题 更多 >