Django REST Framework 更新外键

Posted

技术标签:

【中文标题】Django REST Framework 更新外键【英文标题】:Django REST Framework update foreign key 【发布时间】:2017-08-15 05:40:31 【问题描述】:

我正在尝试更新具有指标模型外键的指标组件模型实例。如果我传递指标的主键,它会返回以下错误:

不能分配“4”:“IndicatorComponent.indicator_id”必须是“Indicator”实例。

但如果我通过指标实例,我会收到以下错误:

“类型不正确。预期的pk值,收到的指标。”

型号

class IndicatorComponent(models.Model):
    indicator_component_id = models.AutoField(
        primary_key=True
    )
    date = models.DateField(
        verbose_name='Fecha',
        auto_now=False,
        null=True
    )
    indicator_id = models.ForeignKey(
        'Indicator',
        null=True
    )

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Componente Indicador'

序列化器

class IndicatorComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.IndicatorComponent
        fields = (
            'indicator_component_id', 'name',
            'description', 'date', 'position_x', 'position_y',
            'size_width', 'size_height', 'indicator_id',
            'template_report_id', 'component_styles_id'
        )
        read_only_fields = ('creation_date', 'last_modified_date',)

我能做些什么来避免这种矛盾?

【问题讨论】:

【参考方案1】:

将foreignKey字段名修改为indicator。如果将其命名为indicator_id,则数据库中的列名为indicator_id_id。而且默认情况下,indicator_component_id 字段是不必要的。

试试这个:

class IndicatorComponent(models.Model):
    date = models.DateField(
        verbose_name='Fecha',
        auto_now=False,
        null=True
    )
    indicator = models.ForeignKey(
        'Indicator',
        null=True
    )

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Componente Indicador'


class IndicatorComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.IndicatorComponent
        fields = (
            'id', 'name',
            'description', 'date', 'position_x', 'position_y',
            'size_width', 'size_height', 'indicator_id',
            'template_report_id', 'component_styles_id'
        )
        read_only_fields = ('creation_date', 'last_modified_date',)

【讨论】:

谢谢,已通过将 indicator_id 列的名称更改为 indicator

以上是关于Django REST Framework 更新外键的主要内容,如果未能解决你的问题,请参考以下文章

在序列化程序中编辑外键字段 - Django Rest Framework

Django Rest Framework:具有通用外键的可写嵌套序列化程序

python django-rest-framework 3.3.3 更新嵌套序列化程序

django-rest-framework:如何更新嵌套的外键?我的更新方法甚至没有被调用

Django Rest Framework 更新字段

Django Rest Framework 如何更新 SerializerMethodField