我对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吗?
答案 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})
或者使用GenericAPIViews或GenericViewSets将请求对象自动传递到序列化器中。