【问题标题】:How to save a model in Django Rest Framework having one to one relationship如何在 Django Rest Framework 中保存具有一对一关系的模型
【发布时间】:2019-06-16 23:35:35
【问题描述】:

我有一个名为 BankDetail 的 Django 模型,它与 User 具有一对一的关系。

#BankeDetails
class BankDetail(models.Model):
    account_holder_name = models.CharField(max_length=100)
    account_number = models.CharField(max_length=50, blank=True, null=True)
    iban = models.CharField("IBAN", max_length=34, blank=True, null=True)
    bank_name = models.CharField(max_length=100)
    bank_address = models.CharField(max_length=500)
    swift_bic_code = models.CharField(max_length=11)
    user = models.OneToOneField(MyUser,on_delete=models.CASCADE)
    accepting_fiat_currency = models.OneToOneField(AcceptedFiatCurrency)
    created_at = models.DateTimeField(auto_now_add=True,null=True)
    updated_at = models.DateTimeField(auto_now=True)

序列化器如下:

class BankDetailSerializer(serializers.ModelSerializer):
    """Serializer for BankDetails"""
    class Meta:
        model = BankDetail
        fields = "__all__"

    def validate(self, data):
        if data['account_number'] or data['iban']:
            raise serializers.ValidationError("Please fill Account Number or IBAN")
        return data

请求负载:

{
    "account_holder_name":"Aladin",
    "account_number":"1239893",
    "bank_name":"Aladin Bank",
    "bank_address":"Republic of Wadia",
    "swift_bic_code":"1",
    "user_id":"1",
    "accepting_fiat_currency_id":"1"
}

现在,当我尝试从视图中保存模型时,出现以下错误:

{
    "user": [
        "This field is required."
    ],
    "accepting_fiat_currency": [
        "This field is required."
    ]
}

我如何传递这些对象的引用,我是否需要使用 id 从数据库中手动检索它们?

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    AFAIR 你应该在序列化器中定义一个相关的模型字段。并且不要使用__all__ 而不是显式写入所有字段。这是我的建议:)

    你应该在以下问题中找到答案:

    Post from StackOverflow

    That helped me last week

    DRF documentation about Serializer relations

    【讨论】:

      【解决方案2】:

      一种解决方案是使用不同的序列化程序在数据库中/从数据库中创建/检索数据。

      您用于创建的序列化程序应该类似于 -

      class BankDetailSerializer(serializers.ModelSerializer):
      """Serializer for BankDetails"""
          class Meta:
              model = BankDetail
              exclude = ('user', 'accepting_fiat_currency', ) # Note we have excluded the related fields
      
          def validate(self, data):
              if data['account_number'] or data['iban']:
                  raise serializers.ValidationError("Please fill Account Number or IBAN")
              return data 
      

      然后在保存序列化程序时传递上述两个排除字段。喜欢 -

      serializer = BankDetailSerializer(data=request.data)
      if serializer.is_valid():
          serializer.save(user=request.user, accepting_fiat_currency=<AcceptedFiatCurrency-object>)
      

      如果您在 DRF 中使用 Generic Views,那么我建议您查看 进入 perform_create 方法。

      【讨论】:

        【解决方案3】:

        您需要发送"user":"1"。而不是"user_id":"1"。其他"accepting_fiat_currency"也一样

        【讨论】:

          猜你喜欢
          • 2015-02-27
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-20
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          相关资源
          最近更新 更多