Python django终结点未返回序列化程序中指定的所有字段
这是源定义:Python django终结点未返回序列化程序中指定的所有字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,这是源定义: class SourceDefinition(models.Model): source = models.ForeignKey(Source, on_delete=models.DO_NOTHING) special_id = models.IntegerField(default=0) ad_group = models.CharField(max_length=50) creator = models.CharField(max_length=
class SourceDefinition(models.Model):
source = models.ForeignKey(Source, on_delete=models.DO_NOTHING)
special_id = models.IntegerField(default=0)
ad_group = models.CharField(max_length=50)
creator = models.CharField(max_length=100)
config = JSONField(default=dict, blank=True)
class SourceDefinitionSerializer(serializers.ModelSerializer):
source = SourceSerializer(read_only=True, many=False)
source_id = serializers.PrimaryKeyRelatedField(source="source", queryset=Source.objects.all(),
write_only=True)
class Meta:
model = SourceDefinition
fields = ['id', 'source', 'source_id', 'special_id', 'ad_group', 'creator', 'config']
发动机:
class EngineDefinition(models.Model):
engine = models.ForeignKey(Engine, on_delete=models.DO_NOTHING)
source_def = models.ForeignKey(SourceDefinition, on_delete=models.DO_NOTHING)
schedule_def = models.ForeignKey(ScheduleDefinition, on_delete=models.DO_NOTHING, null=True, blank=True)
ad_group = models.CharField(max_length=50)
creator = models.CharField(max_length=100)
where_clause = models.CharField(max_length=1000, null=True, blank=True)
config = JSONField(default=dict, blank=True)
class EngineDefinitionSerializer(serializers.ModelSerializer):
engine = EngineSerializer(read_only=True, many=False)
source_def = ScheduleDefinitionSerializer(read_only=True, many=False)
schedule_def = SourceDefinitionSerializer(read_only=True, many=False)
engine_id = serializers.PrimaryKeyRelatedField(source="engine", queryset=Engine.objects.all(),
write_only=True)
source_def_id = serializers.PrimaryKeyRelatedField(source="source_def", queryset=SourceDefinition.objects.all(),
write_only=True)
schedule_def_id = serializers.PrimaryKeyRelatedField(source="schedule_def", queryset=ScheduleDefinition.objects.all(),
write_only=True)
class Meta:
model = EngineDefinition
fields = ['id', 'engine', 'source_def', 'schedule_def', 'engine_id', 'source_def_id', 'schedule_def_id',
'ad_group', 'creator', 'where_clause', 'config']
使用EngineDefinitionSerializer从端点返回的值
{
"id": 1,
"engine": {
"id": 1,
"name": "en"
},
"source_def": {
"id": 1,
"ad_group": "YYY",
"creator": "EEE",
"config": {}
},
"schedule_def": null,
"ad_group": "YYY",
"creator": "EEE",
"where_clause": null,
"config": {}
}
为什么EngineDefinitionSerializer
端点响应中没有返回special\u id
?我还尝试指定所有字段名,而不是使用\uuuuuuuuuuuuuuuuuuu
,结果相同
(需要更多单词worcs words wrods)如果序列化程序中有自定义字段,如案例中的源和源id,则必须在字段列表中明确指定它。逐个指定所有文件,以及源和源id 例如,在您的案例中:
class SourceDefinitionSerializer(serializers.ModelSerializer):
source = SourceSerializer(read_only=True, many=False)
source_id = serializers.PrimaryKeyRelatedField(source="source", queryset=Source.objects.all(), write_only=True)
class Meta:
model = SourceDefinition
fields = '[source, source_id, filed1, field2, .......]'
遗憾的是,从2020年7月开始,没有其他方法可以在自定义字段中使用
\uuuu all\uuuuu
,解析Meta
类的fileds
子句的源代码,您可以查看它是如何工作的,不是太复杂的代码我尝试显式声明所有字段,但出现了相同的结果(请参见编辑到主帖子)如果我直接使用SourceDefinitionSerializer
访问某个视图,则会出现特殊\u id
,但在上述外部视图中,它不会出现。等等,为什么在EngineDefinitionSerializer
中,源定义为ScheduleDefinitionSerializer,而日程定义为SourceDefinitionSerializer?不应该吗相反吗?@YuriNudelman谢谢……这就是问题所在!