Создать запись по идентификатору с отношением DRF - PullRequest
0 голосов
/ 04 апреля 2019

Я довольно новичок в Django Rest Framework (также Джанго).

У меня есть Budget, и у каждого Budget будет свой Series.Всякий раз, когда я возвращаю Budget, я возвращаю соотношение Series:

BudgetSerializer

class BudgetSerializer(ModelSerializer):
    series = SeriesSerializer()

    class Meta:
        model = Budget
        fields = ('id',
                  'date',
                  'created_at',
                  'document_number',
                  'total',
                  'document_type',
                  'series', 'hash', 'hash_control')

SeriesSerializer

class SeriesSerializer(ModelSerializer):
  fiscal_entity = FiscalEntitySerializer()

  class Meta:
    model = Series
    fields = ('id',
              'created_at',
              'series_prefix',
              'document_type',
              'starts_in',
              'fiscal_entity')

Всякий раз, возвращая Budget, он идет с Series, как и предполагалось, но всякий раз, когда я пытаюсь создать новый Budget, он выдает ошибку Series field is required.Я предполагаю, что DRF ожидает, что целый новый объект Series сможет создать этот новый Series, но я не хотел бы создавать новый Series, но ссылаться на существующий его id.

Что-то вроде:

curl -X POST \
  http://localhost:8081/v1/budget/ \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Postman-Token: 5755d65e-a159-45c9-949e-14724ace41d5' \
  -H 'Token: 5D4kFFiXjXeOwM4rrA3xwhL8hYnzK9XXQMo1Fym_suDiTEOdznoYlebaT78F9NUnAE_xobAXuT8leLwZy1acaFZ5yAubqhxbx99xvw4ucHNhd1HMEtLhshO0' \
  -H 'cache-control: no-cache' \
  -d 'date=2019-02-04&document_number=0202&total=221.23&series=0e4e6251b43849d390bca19c7b722e4d&document_type=PF&created_at=2020-02-04%2023%3A50%3A25&last_document_hash_control=h2kY3j0B%2BO2bF2n5zLzvYLGcpf2OeidqY7GCsG2gusvooqoAJUclCykJz8GqaAqq76rbQYb9ICJRZAd0fXGYYH%2Fi6yox%2FJY0k8YRPGlYLANyqJCMxio80sR%2BZONgH%2FrTk0fykwX4q2%2BuMs7qCOXbksY%2FFB773NJYMWjQz1Jo%2BrI%3D'

Я пробовал несколько подходов как series = SeriesSerializer(read_only=True) в BudgetSerializer и другие подходы, которые, кажется, не работают.

Может ли более опытный разработчик объяснить, почему DRF ждет нового Series и почему мы не можем просто ссылаться на существующий по его id

1 Ответ

2 голосов
/ 04 апреля 2019

Вы можете переопределить __init__ для изменения поля series.Например:

class BudgetSerializer(ModelSerializer):

    def __init__(self, *args, **kwargs):
        super(BudgetSerializer, self).__init__(*args, **kwargs)
        request = self.context.get('request', None)
        if request and request.method == 'GET':
            self.fields['series'] = SeriesSerializer()

    class Meta:
        model = Budget
        fields = ('id',
                  'date',
                  'created_at',
                  'document_number',
                  'total',
                  'document_type',
                  'series', 'hash', 'hash_control')

Затем передайте запрос в сериализаторе следующим образом:

 BudgetSerializer(context={'request':request})

Или используйте GenericAPIViews или GenericViewSets , который автоматически проходитобъект запроса в сериализатор.

...