Метод создания перезаписи для вложенного сериализатора Django restframework - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь использовать вложенный записываемый сериализатор в django -rest-framework. Когда я отправляю POST-запрос со следующими данными:

{
    "acc_name": "Salary Card",
    "acc_type_id": {
        "id": 2,
        "acc_type_name": "Debit Card"
    },
    "credit_amt": null,
    "bill_dt": null,
    "due_dt": null,
    "balance": "0.00",
    "comments": null
}

Я получил ошибку:

Cannot assign "OrderedDict([('acc_type_name', 'Debit Card')])": "Accounts.acc_type_id" must be a "AccountTypes" instance.

Я фактически передал id для AccountTypes, но почему restframework удаляет его автоматически? Как я могу решить эту проблему? Как я могу создать новую учетную запись с существующим типом учетной записи?

Просмотры:

class AccountTypesViewSet(ListAPIView):
    name = __name__
    pagination_class = None
    queryset = AccountTypes.objects.filter(active='Y')
    serializer_class = AccountTypesSerializer


class AccountsViewSet(viewsets.ModelViewSet):
    pagination_class = None
    queryset = Accounts.objects.all()
    serializer_class = AccountsSerializer

Модели:

class AccountTypes(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    acc_type_name = models.CharField(max_length=50)
    active = models.CharField(max_length=1, default='Y')

    class Meta:
        db_table = f'"{schema}"."taccount_types"'
        managed = False

class Accounts(models.Model):
    id = models.AutoField(primary_key=True, editable=False)
    acc_name = models.CharField(max_length=1024)
    acc_type_id = models.ForeignKey(
        to=AccountTypes,
        db_column='acc_type_id',
        related_name='accounts',
        on_delete=models.DO_NOTHING
    )
    credit_amt = models.DecimalField(max_digits=11, decimal_places=2, null=True)
    bill_dt = models.DateField(null=True)
    due_dt = models.DateField(null=True)
    balance = models.DecimalField(max_digits=11, decimal_places=2, default=0)
    comments = models.CharField(max_length=1024, null=True)

    class Meta:
        db_table = f'"{schema}"."taccounts"'
        managed = False

Сериализаторы:

class AccountTypesSerializer(serializers.ModelSerializer):
    class Meta:
        model = AccountTypes
        fields = ('id', 'acc_type_name')


class AccountsSerializer(serializers.ModelSerializer):
    # acc_type = serializers.SlugRelatedField(slug_field='acc_type_name', source='acc_type_id', read_only=True)
    acc_type_id = AccountTypesSerializer()

    class Meta:
        model = Accounts
        fields = ('id', 'acc_name', 'acc_type_id', 'credit_amt',
                  'bill_dt', 'due_dt', 'balance', 'comments')

    def create(self, validated_data):
        accounts_instance = Accounts.objects.create(**validated_data)
        return accounts_instance

1 Ответ

0 голосов
/ 22 марта 2020

Вам не нужно устанавливать id поле, потому что Django сделает это само, поэтому удалите следующие строки:

id = models.AutoField(primary_key=True, editable=False)

Далее вам нужно отправить id из AccountTypes модель для создания новой учетной записи, и вы даете Django дикт fields = ('id', 'acc_type_name'). Он не знает, что с этим делать. Так что просто отправьте id как номер. И вам не нужно AccountTypesSerializer, а также эта строка acc_type_id = AccountTypesSerializer().

Далее вы должны создать учетную запись, а не в сериализаторе, и сохранить ее после создания.

...