Как сохранить модель в Django Rest Framework, имеющую отношение один к одному - PullRequest
0 голосов
/ 23 января 2019

У меня есть модель Django с именем BankDetail, которая имеет отношение один-к-одному с Пользователем.

#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."
    ]
}

Как я могу передать ссылку на эти объекты, нужно ли мневручную получить их из БД, используя идентификаторы?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Одним из решений является использование другого сериализатора для создания / извлечения данных в / из базы данных.

Ваш сериализатор для создания должен выглядеть примерно так -

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, то я бы посоветовал вам изучить метод execute_create .

0 голосов
/ 23 января 2019

AFAIR вы должны определить связанное поле модели в сериализаторе. И не используйте __all__ вместо явной записи всех полей. Это моя рекомендация:)

Вы должны найти ответ на следующие вопросы:

Сообщение от StackOverflow

Это помогло мне на прошлой неделе

Документация DRF о связях сериализатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...