我正在尝试根据父模型的某些标准(而不是外键)向现有序列化程序添加嵌套序列化程序。用例是返回一个“Research”对象,其中包含一个“ResearchTemplate”对象数组,这些对象通过在 Postgres ArrayField 上进行过滤来识别。
模型
class Research(TimeStampedModel): category = models.CharField(max_length=100, choices=RESEARCH_TEMPLATE_CATEGORIES, default='quote') body = models.CharField(max_length=1000, blank=True, default='') #The body of text comprising the nugget additionaldata = JSONField(null=True) # all the varying values to be merged into a wrapper def __str__(self): return self.body class Meta: ordering = ('created',) class ResearchTemplate(TimeStampedModel): template = models.TextField(blank=True, default='') category = models.CharField(max_length=100, choices=RESEARCH_TEMPLATE_CATEGORIES, default='quote') mergefields = ArrayField(models.CharField(max_length=200), blank=True) def save(self, *args, **kwargs): merges = re.findall("{{(.*?)}}", self.template) #get all the template names from within the mustaches self.mergefields = list(set(merges)) #TODO: Make Unique super(TimeStampedModel, self).save(*args, **kwargs) def __str__(self): return self.wrapper class Meta: ordering = ('created',)
序列化器
class ResearchSerializer(serializers.ModelSerializer): templates = ResearchTemplateSerializer(many=True) class Meta: model = Research fields = ('id', 'created', 'speaker', 'body', 'templates') class ResearchTemplateSerializer(serializers.RelatedField): def get_queryset(self, values): return ResearchTemplate.objects.filter(mergefields__contained_by=['django']) #This must an array of keys from the Research object's JSON field class Meta: model = ResearchTemplate fields = ('id', 'template')
当有外键映射它们时,我已经能够嵌套序列化程序,但是我无法使用自定义查询集这样做。也许我没有正确考虑这个问题,我需要在研究模型上使用某种形式的“关系”字段。
如何嵌套一个序列化列表,其中包含从具有从父模型指定的值的过滤器返回的所有行?
最佳答案
您可以使用 DRF 的 SerializerMethodField
.
将您的 ResearchTemplateSerializer
定义为普通的 ModelSerializer,而不是 RelatedField
。
然后将您的 ResearchSerializer
替换为:
class ResearchSerializer(serializers.ModelSerializer):
templates = serializers.SerializerMethodField()
class Meta:
model = Research
fields = ('id', 'created', 'speaker', 'body', 'templates')
def get_templates(self, obj):
values = obj.get_values() # whatever your filter values are. obj is the Research instance
templates = ResearchTemplate.objects.filter(mergefields__contained_by=values) # Or whatever queryset filter
return ResearchTemplateSerializer(templates, many=True).data
关于python - 如何将不相关模型的查询集序列化为嵌套序列化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42775784/