Django 通过id与关系DRF创建记录

Django 通过id与关系DRF创建记录,django,django-rest-framework,Django,Django Rest Framework,我对Django Rest框架(也是Django)相当陌生 我有一个预算,每个预算都有它的系列。每当我返回预算时我都会返回系列的关系: 预算编制者 class BudgetSerializer(ModelSerializer): series = SeriesSerializer() class Meta: model = Budget fields = ('id', 'date',

我对Django Rest框架(也是Django)相当陌生

我有一个
预算
,每个
预算
都有它的
系列
。每当我返回
预算时
我都会返回
系列的关系

预算编制者

class BudgetSerializer(ModelSerializer):
    series = SeriesSerializer()

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

  class Meta:
    model = Series
    fields = ('id',
              'created_at',
              'series_prefix',
              'document_type',
              'starts_in',
              'fiscal_entity')
系列化试剂

class BudgetSerializer(ModelSerializer):
    series = SeriesSerializer()

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

  class Meta:
    model = Series
    fields = ('id',
              'created_at',
              'series_prefix',
              'document_type',
              'starts_in',
              'fiscal_entity')
无论何时返回
预算
它都会按照预期附带
系列
,但无论何时我尝试创建新的
预算
它都会给出错误
系列字段是必需的
。我猜DRF希望一个全新的
系列
对象能够创建新的
系列
,但我不希望创建一个新的
系列
,而是通过其
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'
我在
BudgetSerializer
中尝试了几种方法,如
series=SeriesSerializer(read_only=True)
,以及其他似乎不起作用的方法


有经验的开发人员能否解释为什么DRF正在等待一个新的
系列
,以及为什么我们不能简单地通过它的
id引用一个现有的

您可以覆盖
\uuuu init\uuuuu
来更改
系列
字段。例如:

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})

或使用或自动将请求对象传递到序列化程序。

您可以覆盖
\uuuu init\uuuu
以更改
系列
字段。例如:

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})

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

奇怪的是,
read\u
不起作用。使用“只读”
时会出现什么错误?@Ken4scholars无错误。它只是给了我同样的错误
序列是必填字段
奇怪的是
只读
不起作用。使用“只读”
时会出现什么错误?@Ken4scholars无错误。它只是给了我同样的错误
Series是必填字段