【发布时间】:2019-12-02 20:32:28
【问题描述】:
当我使用这个查询时,我有三个基本的嵌套序列化器当前正在返回一个嵌套数据结构(如下所示):
queryset = Regulation.objects.all()
serializer_class = RegulationSerializer(queryset, many=True)
我的models.py如下:
class Regulation(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.TextField(null=False)
documents = models.ManyToManyField(Document, related_name='regulation_documents', through="DocumentRegulation")
portal = models.BooleanField(default=False)
class RegulationVersion(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
regulation = models.ForeignKey(Regulation, related_name='versions', blank=False, null=False, on_delete=models.DO_NOTHING)
name = models.CharField(max_length=20, null=False)
class Iteration(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
version = models.ForeignKey(RegulationVersion, related_name='iterations', blank=False, on_delete=models.DO_NOTHING)
organization = models.ForeignKey(Organization, blank=False, null=False, on_delete=models.DO_NOTHING)
name = models.CharField(max_length=60, blank=False, null=False)
date_created = models.DateTimeField(_('created at'), auto_now_add=True)
created_by_user = models.ForeignKey(User, blank=False, null=False, on_delete=models.DO_NOTHING)
class Meta:
unique_together= ('name', 'organization', 'version')
serializers.py 结构如下:
class FilteredIterationSerializer(serializers.ListSerializer):
def to_representation(self, data):
organization_id = self.context.get('organization_id')
data = data.filter(organization=organization_id)
return super(FilteredIterationSerializer, self).to_representation(data)python
class IterationSerializer(serializers.ModelSerializer):
class Meta:
model = Iteration
list_serializer_class = FilteredIterationSerializer
fields = ('id', 'organization', 'version', 'name', 'date_created', 'created_by_user')
class VersionSerializer(serializers.ModelSerializer):
iterations = IterationSerializer(many=True, read_only=True)
class Meta:
model = RegulationVersion
fields = ('name', 'iterations')
class RegulationSerializer(serializers.ModelSerializer):
versions = VersionSerializer(many=True, read_only=True)
class Meta:
model = Regulation
fields = ('name', 'versions')
depth = 2
序列化输出:
[{ name: "2019-final"
versions: {
0: { name: "2019-01",
iterations: (25) [{…}, {…}, {…}]
}
1: { name: "2019-02",
iterations: []
}
}
{ name: "2020-final"
versions: {
0: { name: "2020-01",
iterations: []
}
1: { name: "2020-02",
iterations: []
}
}]
我如何排除没有任何iterations的所有versions,以及排除没有任何@的regulations 987654328@或嵌套iterations。
使用上面的序列化输出,我不想返回name 为"2020-final" 的对象,因为它的versions 都没有iterations。我也不想返回name 是"2019-02" 的version 对象,因为它没有迭代。所需的输出如下所示:
[{ name: "2019-final"
versions: {
0: { name: "2019-01",
iterations: (25) [{…}, {…}, {…}]
}
}]
【问题讨论】:
-
您能否为所有涉及的模型添加您的
models.py代码? -
请同时包含
FilteredIterationSerializer的代码,以及您可能使用的任何django-filters代码。 -
非常感谢您清理问题...我从未见过格式如此精美的问题。我有时会犹豫放太多代码,不想让别人不知所措。
标签: django django-models django-rest-framework django-views