DRF 3.7.0 删除了字段中的 None 处理并破坏了我的外键源字段。有办法解决吗?

Esc*_*her 2 python django django-rest-framework

我注意到,这个Django的REST框架提交打破了我的项目时,从升级3.6.33.7.0。这是现在已损坏的模型的相关部分:

class MarketingPlan(models.Model):
    promotion = models.ForeignKey(Promotion, null=True)

class MarketingPlanSerializer(serializers.ModelSerializer):
    promotion = serializers.CharField(
        source='fk_promotion.id',
        read_only=False,
        allow_null=True)
    class Meta:
        model = MarketingPlan
        fields = ('promotion',)
Run Code Online (Sandbox Code Playgroud)

访问data此序列化程序的属性,当Promotion外键为None

>> mp = MarketingPlan.objects.first()
>> MarketingPlanSerializer(mp).data

rest_framework/fields.py", line 100, in get_attribute
instance = getattr(instance, attr)
   AttributeError: 'NoneType' object has no attribute 'id'
Run Code Online (Sandbox Code Playgroud)

因此,虽然get_attribute过去常常跳过None,但现在它会在我的特定情况下搜索.id相关字段的属性promotion,即使它是None.

有什么解决方法?

Lin*_*via 6

当然,您需要为序列化程序的相关字段显式设置默认值:

class MarketingPlanSerializer(serializers.ModelSerializer):
    promotion = serializers.CharField(
        source='fk_promotion.id',
        read_only=False,
        allow_null=True,
        default=None)
    class Meta:
        model = MarketingPlan
        fields = ('promotion',)
Run Code Online (Sandbox Code Playgroud)