python - 如何将不相关模型的查询集序列化为嵌套序列化程序?

标签 python django postgresql serialization django-rest-framework

我正在尝试根据父模型的某些标准(而不是外键)向现有序列化程序添加嵌套序列化程序。用例是返回一个“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/

相关文章:

python - 随机 2D 坐标生成

python - 根据另一列更新一个 Pandas 列的不可用值

带有 order_by 的 Django 查询,不同的和对 Postgresql 的限制

sql - 为每行选择除等于之外的两行值?

python - 如何从 github 上的 master 分支安装 pip 模块?

Python 2.x - ConfigParser 去除多行值中的空行

python - 安装 Graphite 时出现 Django 错误 - settings.DATABASES 配置不正确。请提供 ENGINE 值

django - Fabric:Python 作为 ???:Javascript

javascript - Django 民意调查教程第 3 部分 : polls/templates/polls/index. html - 此代码是什么?这不是 python

postgresql - 触发器中的动态函数调用