【问题标题】:DRF- Got assertion error when I give Post RequestDRF-当我发出发布请求时出现断言错误
【发布时间】:2022-01-21 07:48:07
【问题描述】:

错误

AssertionError: The `.create()` method does not support writable dotted-source fields by default.
Write an explicit `.create()` method for serializer `hrm_apps.configuration.serializers.CurrencySerializer`, or set `read_only=True` on dotted-source serializer fields.

models.py,

class CurrencyMaster(models.Model):
    code = models.CharField(max_length=3, null=False, unique=True)
    name = models.CharField(max_length=100, null=False, unique=True)

    def __str__(self):
        return self.name
class Currency(models.Model):
    currency_master = models.OneToOneField(CurrencyMaster, on_delete=models.RESTRICT)
    conversion_rate = models.FloatField(null=False)

    def __str__(self):
        return self.currency_master.name

views.py,

class CurrencyViewSet(viewsets.ModelViewSet):
    queryset = Currency.objects.all()
    serializer_class = CurrencySerializer
    lookup_field = 'id'

serializers.py,

class CurrencySerializer(serializers.ModelSerializer):
    currency_master = serializers.CharField(source="currency_master.name")

    class Meta:
        model = Currency
        fields = ['id', 'currency_master', 'conversion_rate']

当我发出 post 请求时,我得到了类似上面的断言错误,

class CurrencySerializer(serializers.ModelSerializer):
    currency_master = serializers.CharField(source="currency_master.name")

    class Meta:
        model = Currency
        fields = ['id', 'currency_master', 'conversion_rate']

    def create(self, validated_data):
        return Currency.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.currency_master = validated_data.get('currency_master', instance.currency_master)
        instance.conversion_rate = validated_data.get('conversion_rate', instance.conversion_rate)
        return instance

我在上面尝试了这个错误“ValueError:无法分配“{'name':'ALL - Albania Lek'}”:“Currency.currency_master”必须是“CurrencyMaster”实例”。这个怎么解决???

【问题讨论】:

  • 如错误所示,.create() 方法不支持可写的点源字段,在您的情况下为 currency_master.name。你能告诉我你想要达到什么目标吗?我想,您可以在进行 POST 请求时轻松提供currency_master id,为什么需要源字段?
  • 我想将数据发布到货币模型中。我的帖子请求给出了错误。我该如何处理一对一的字段??

标签: django django-rest-framework


【解决方案1】:

自定义create 方法。

class CurrencySerializer(serializers.ModelSerializer):
    currency_master = serializers.CharField(source="currency_master.name")

    class Meta:
        model = Currency
        fields = ['id', 'currency_master', 'conversion_rate']

    def create(self, validated_data):
        currency_master_name = validated_data.pop('currency_master')["name"]
        currency_master_obj = get_object_or_404(CurrencyMaster, name=currency_master_name)
        validated_data["currency_master"] = currency_master_obj
        return Currency.objects.create(**validated_data)

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2015-10-07
    • 2016-09-15
    • 2019-05-03
    • 2019-01-23
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多