【问题标题】:Invalid pk (Model Object) does not exist - Django REST Framework无效的 pk(模型对象)不存在 - Django REST 框架
【发布时间】:2020-04-13 12:21:46
【问题描述】:

我希望创建一个商家并添加银行帐户详细信息。

这些是我的序列化程序:

class MerchantSerializer(core_serializers.BaseModelSerializer):
    """
    MerchantSerializer
    """
    bank_account_details = serializers.JSONField()
    merchant_entity_id = serializers.UUIDField()

    class Meta:
        model = paylater_models.Merchant
        fields = ('merchant_entity_id', 'bank_account_details',)

    def create(self, validated_data):
        """
        create
        :param validated_data:
        :return:
        """

        # with transaction.atomic():
        # Normalizing and separating information
        bank_account_data = validated_data.pop('bank_account_details')
        validated_data.update({'merchant_number': core_utils.generate_alphanumeric_strings()})

        # Creating merchant instance
        instance = super(MerchantSerializer, self).create(validated_data)

        # Creating bank account details for the newly created merchant
        bank_account_data.update({'merchant': instance})
        bank_account_serializer = BankAccountDetailSerializer(data=bank_account_data)
        bank_account_serializer.is_valid(raise_exception=True)
        bank_account_serializer.save()

        return instance


class BankAccountDetailSerializer(core_serializers.BaseModelSerializer):
    """
    BankAccountDetailSerializer
    """

    bank_name = serializers.CharField(max_length=256)
    account_number = serializers.CharField(max_length=18)
    ifsc = serializers.CharField(max_length=11)

    class Meta:
        model = paylater_models.BankAccountDetail
        fields = ('bank_name', 'account_number', 'ifsc', 'merchant',)

    def validate_account_number(self, account_number):
        """
        validate_account_number
        :param bank_name:
        :return:
        """

        if re.search('[0-9]{9,18}', str(account_number)) is not None:
            return account_number

        raise paylater_exceptions.InvalidBankAccountNumberError()

    def validate_ifsc(self, ifsc):
        """
        validate_ifsc
        :param ifsc:
        :return:
        """

        if re.search('[A-Za-z]{4}[a-zA-Z0-9]{7}', ifsc) is not None:
            return ifsc

        raise paylater_exceptions.InvalidIFSCError()

它给了我一个无效的 pk \"Merchant object (f7f3f77a-7f18-4a27-ac39-1f182d233006)\" - 对象不存在。

我在这里做错了什么?

我知道问题出在我传递给 BankAccountDetailSerializer 的商家实例上,但我真的不知道它是什么以及如何解决这个问题。

【问题讨论】:

  • 确保您正在请求获取不存在的对象。确认您正在使用的密钥和对应的对象确实存在于数据库中。
  • 另外,如果您分享一种重现问题的方法,将会有所帮助。谢谢
  • 嘿@luistm。复制问题的一种方法是使用数据调用序列化程序` { "merchant_entity_id": "0e91bec0-497f-4878-8a3f-ac97383208ff", "bank_account_details": { "bank_name": "HDFC", "account_number": " 123456789", "ifsc": "HDFC0000123" } } ` 是的,该对象存在于正在访问的数据库中
  • 您好,抱歉,我无法帮助您。您应该提供复制问题所需的最少代码。我什至看不到 BankAccountDetail,也没有任何数据可以填充它。谢谢

标签: django python-3.x django-rest-framework


【解决方案1】:

解决方案非常简单,您只需使用商家.pk 而不是商家对象。试试这个:

bank_account_data.update({'merchant': instance.pk})

将商家序列化程序创建函数中的当前行替换为上述行。那么它应该可以工作了。

请记住,当您想向模型序列化程序提供相关对象时,它应该是主键。除非您使用的是嵌套序列化程序。

【讨论】:

    【解决方案2】:

    @zaphod100.10 提供的上述问题的解决方案部分正确,因为它解决了序列化程序中涉及的基本问题,但还有更多问题,这就是我决定写这个答案的原因。

    两个要点:

    1. merchant.pkmerchant.idBankAccountDetailSerializer 所期望的。
    2. BankAccountDetailSerializer 上的字段 merchant 需要更改为 merchant_id,现在看起来像这样:
    class BankAccountDetailSerializer(core_serializers.BaseModelSerializer):
        """
        BankAccountDetailSerializer
        """
        bank_name = serializers.CharField(max_length=256)
        account_number = serializers.CharField(max_length=18)
        ifsc = serializers.CharField(max_length=11)
        merchant_id = serializers.UUIDField()
    
        class Meta:
            model = paylater_models.BankAccountDetail
            fields = ('bank_name', 'account_number', 'ifsc', 'merchant_id',)
    

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2015-07-14
      • 2018-12-09
      • 1970-01-01
      • 2023-03-23
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多