通过具有关系DRF的ID创建记录

时间:2019-04-04 09:43:59

标签: django django-rest-framework

我对Django Rest Framework(也是Django)还很陌生。

我有一个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,而是通过其{{ 1}}。

类似的东西:

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)和其他似乎无效的方法。

有经验的开发人员可以解释为什么DRF正在等待新的BudgetSerializer以及为什么我们不能简单地通过其Series引用现有的DRF吗?

1 个答案:

答案 0 :(得分:2)

您可以覆盖__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})

或者使用GenericAPIViewsGenericViewSets将请求对象自动传递到序列化器中。