当前位置: 首页 > 知识库问答 >
问题:

如何将来自无关模型的queryset序列化为嵌套序列化程序?

钱言
2023-03-14

我正在尝试根据父模型的某些条件,而不是外键,向现有的序列化器添加嵌套序列化器。用例是返回一个带有“ResearchTemplate”对象数组的“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')

共有1个答案

芮立果
2023-03-14

您可以使用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
 类似资料:
  • 问题内容: 我使用的是Django Rest Framework,其中有以下两个序列化器: ServiceType模型如下所示: 我想通过更改相关服务(例如删除其中的一些服务)来更新现有实例。为此,我正在这样做: 我面临的问题是没有提供该字段-这意味着我得到了-尽管我在 字段中明确添加了该字段。 编辑 这是我发布的一个示例性请求(来自Chrome): 我在做什么错以及如何使用嵌套序列化程序获取对象

  • 问题内容: 有一个简单的POJO- 内部带有子类别。嵌套可能会很深,因为每个子类别都可能包含子子类别,依此类推。我想通过jersey 返回为REST资源,序列化为json(由jackson提出)。问题是,我不能真正限制序列化的深度,因此所有类别树都可以序列化。 有没有办法在完成第一级(即具有其第一级子类别)后立即停止对杰克逊进行序列化的对象? 问题答案: 如果可以从POJO中获取当前深度,则可以使

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 给定这样一个类 如何实现可以处理嵌套泛型类型的自定义Kafka反序列化器? 附注:我正在使用jackson进行序列化/反序列化。

  • 问题内容: 我从看起来像这样的API获取JSON: 我尝试了几种方法来在c#对象中表示此JSON(太多内容无法在此处列出)。我已经尝试过使用列表和字典,这是我尝试表示它的最新示例: 这是我用来反序列化JSON的方法: 包含和。并且包含,但是是。因此,除了反序列化之外,什么都没有。 它应该很简单,但是由于某种原因我无法弄清楚正确的对象表示形式 问题答案: 要使用,即: 假设项目名称和随响应而变化,并