thisのような書き込み可能なネストされたシリアライザを作成する方法と、一般的な外部キー(here)をシリアル化する方法の例があります。Django Rest Framework:一般的な外部キーを持つ書き込み可能なネストされたシリアライザ
しかし、私は同時に両方を行う方法、つまり一般的な外部キーフィールドのためのネストされた書き込み可能なシリアライザを作成する方法を見つけることができません。
class RecurringMeetingRelatedField(serializers.RelatedField):
def to_representation(self, value):
if isinstance(value, DailyMeeting):
serializer = DailyMeetingSerializer(value)
elif isinstance(value, WeeklyMeeting):
serializer = WeeklyMeetingSerializer(value)
else:
raise Exception('Unexpected type of tagged object')
return serializer.data
class MeetingSerializer(serializers.ModelSerializer):
recurring_meeting = RecurringMeetingRelatedField()
class Meta:
model = Meeting
fields = '__all__'
私は:私は私のserializers.py
にカスタムフィールドを作成した後
class Meeting(models.Model):
# More fields above
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
recurring_meeting = GenericForeignKey('content_type', 'object_id')
class DailyMeeting(models.Model):
meeting = GenericRelation(Meeting)
# more fields
class WeeklyMeeting(models.Model):
meeting = GenericRelation(Meeting)
# more fields
:私のモデルで
はどちらかDailyMeeting
またはWeeklyMeeting
ようにすることができGenericForeignKey
とMeeting
モデルがあり次のようなJSONを渡します。
{
"start_time": "2017-11-27T18:50:00",
"end_time": "2017-11-27T21:30:00",
"subject": "Test now",
"moderators": [41],
"recurring_meeting":{
"interval":"daily",
"repetitions": 10,
"weekdays_only": "True"
}
}
しかし、問題は、私は次のエラーを取得していますということです。
AssertionError: Relational field must provide a
queryset
argument, overrideget_queryset
, or set read_only=True
.
リレーショナルフィールドはread_only
でなければならないのはなぜ? read_only
と設定すると、シリアライザのdata
には渡されません。
どのような種類のクエリーセットを用意しなければなりませんか?
私はシナリオを確認していなかったが、あなたは、APIからrecurring_meetingを渡すために持っていけない...(そのシリアライザに追加()メソッドを作成する)ので、あなたが '' –
をread_only''' '設定することができます'' read_only''に設定すると、 '' create() ''メソッドに渡される '' validated_data''には何もありません。この場合、recurring_meetingは完全に無視されます。 – Galil